OSDN Git Service

コード整形
[kcd/KCD.git] / KCD / Fleet.swift
1 //
2 //  Fleet.swift
3 //  KCD
4 //
5 //  Created by Hori,Masaki on 2017/01/22.
6 //  Copyright © 2017年 Hori,Masaki. All rights reserved.
7 //
8
9 import Cocoa
10
11 fileprivate var pDeckContext = 0
12
13 final class Fleet: NSObject {
14     
15     let fleetNumber: Int
16     
17     private let deckObserveKeys = [
18         "selection.ship_0", "selection.ship_1", "selection.ship_2",
19         "selection.ship_3", "selection.ship_4", "selection.ship_5"
20     ]
21     
22     init?(number: Int) {
23         
24         guard case 1...4 = number
25             else {
26                 print("Fleet number out of range")
27                 return nil
28         }
29         
30         fleetNumber = number
31         deckController = NSObjectController()
32         
33         super.init()
34         
35         deckController.entityName = Deck.entityName
36         deckController.managedObjectContext = ServerDataStore.default.context
37         deckController.fetchPredicate = NSPredicate(format: "id = %ld", number)
38         let req = NSFetchRequest<NSFetchRequestResult>()
39         req.entity = NSEntityDescription.entity(forEntityName: Deck.entityName,
40                                                 in: deckController.managedObjectContext!)
41         req.predicate = deckController.fetchPredicate
42         
43         do {
44             
45             try deckController.fetch(with: req, merge: false)
46             
47         } catch {
48             
49             print("Fetch error")
50             return nil
51             
52         }
53         
54         deck = deckController.content as? Deck
55         deckObserveKeys.forEach { deckController.addObserver(self, forKeyPath: $0, context: &pDeckContext) }
56     }
57     
58     deinit {
59         
60         deckObserveKeys.forEach { deckController.removeObserver(self, forKeyPath: $0) }
61         
62     }
63     
64     dynamic private(set) var ships: [Ship] = []
65     private let deckController: NSObjectController
66     private weak var deck: Deck?
67     
68     dynamic var name: String? { return deck?.name }
69     func keyPathsForValuesAffectingName() -> Set<String> {
70         
71         return ["deck.name"]
72     }
73     dynamic var id: NSNumber? { return deck?.id as NSNumber? }
74     func keyPathesForValuesAffectiongId() -> Set<String> {
75         
76         return ["deck.id"]
77     }
78     
79     subscript(_ index: Int) -> Ship? { return deck?[index] }
80     
81     override func observeValue(forKeyPath keyPath: String?,
82                                of object: Any?,
83                                change: [NSKeyValueChangeKey : Any]?,
84                                context: UnsafeMutableRawPointer?) {
85         
86         if context == &pDeckContext {
87             
88             ships = (0..<6).flatMap { return self[$0] }
89             
90             return
91         }
92         
93         super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context)
94     }
95 }