OSDN Git Service

第三部隊の7隻目にアクセスすると落ちる問題を修正
[kcd/KCD.git] / KCD / Deck.swift
1 //
2 //  KCDeck.swift
3 //  KCD
4 //
5 //  Created by Hori,Masaki on 2017/01/29.
6 //  Copyright © 2017年 Hori,Masaki. All rights reserved.
7 //
8
9 import Cocoa
10
11 // swiftlint:disable variable_name
12 final class Deck: KCManagedObject {
13     
14     @NSManaged var flagship: NSNumber?
15     @NSManaged var id: Int
16     @NSManaged var member_id: NSNumber?
17     @NSManaged var mission_0: Int
18     @NSManaged var mission_1: Int
19     @NSManaged var mission_2: Int
20     @NSManaged var mission_3: Int
21     @NSManaged var name: String
22     @NSManaged var name_id: NSNumber?
23     @NSManaged var ship_0: Int
24     @NSManaged var ship_1: Int
25     @NSManaged var ship_2: Int
26     @NSManaged var ship_3: Int
27     @NSManaged var ship_4: Int
28     @NSManaged var ship_5: Int
29 }
30 // swiftlint:eable variable_name
31
32 extension Deck {
33     
34     func setShip(id: Int, for position: Int) {
35         
36         switch position {
37         case 0: ship_0 = id
38         case 1: ship_1 = id
39         case 2: ship_2 = id
40         case 3: ship_3 = id
41         case 4: ship_4 = id
42         case 5: ship_5 = id
43         default: break // fatalError("Deck.setShip: position out of range.")
44         }
45     }
46     
47     func shipId(of position: Int) -> Int? {
48         
49         switch position {
50         case 0: return ship_0
51         case 1: return ship_1
52         case 2: return ship_2
53         case 3: return ship_3
54         case 4: return ship_4
55         case 5: return ship_5
56         default: return nil
57         }
58     }
59     
60     private func ship(ofId identifier: Int) -> Ship? {
61         
62         guard let moc = self.managedObjectContext else { return nil }
63         
64         let req = NSFetchRequest<Ship>(entityName: Ship.entityName)
65         req.predicate = NSPredicate(#keyPath(Ship.id), equal: identifier)
66         
67         guard let ships = try? moc.fetch(req) else { return nil }
68         
69         return ships.first
70     }
71     
72     subscript(_ index: Int) -> Ship? {
73         
74         guard let shipId = shipId(of: index) else { return nil }
75         
76         return ship(ofId: shipId)
77     }
78     
79     subscript(_ range: CountableClosedRange<Int>) -> [Ship] {
80         
81         return range.flatMap { self[$0] }
82     }
83 }