OSDN Git Service

Squashed commit of the following: Swiftに変換した
[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 DeckContext = 0
12
13 class Fleet: NSObject {
14     let fleetNumber: Int
15     private let deckObserveKeys = [
16         "selection.ship_0", "selection.ship_1", "selection.ship_2",
17         "selection.ship_3", "selection.ship_4", "selection.ship_5",
18         ]
19     
20     init?(number: Int) {
21         guard 1...4 ~= number
22             else {
23                 print("Fleet number out of range")
24                 return nil
25         }
26         fleetNumber = number
27         deckController = NSObjectController()
28         super.init()
29         
30         deckController.entityName = "Deck"
31         deckController.managedObjectContext = ServerDataStore.default.managedObjectContext
32         deckController.fetchPredicate = NSPredicate(format: "id = %ld", number)
33         let req = NSFetchRequest<NSFetchRequestResult>()
34         req.entity = NSEntityDescription.entity(forEntityName: "Deck", in: deckController.managedObjectContext!)
35         req.predicate = deckController.fetchPredicate
36         do {
37             try deckController.fetch(with: req, merge: false)
38         }
39         catch {
40             print("Fetch error")
41             return nil
42         }
43         deck = deckController.content as? KCDeck
44         deckObserveKeys.forEach { deckController.addObserver(self, forKeyPath: $0, context: &DeckContext) }
45     }
46     deinit {
47         deckObserveKeys.forEach { deckController.removeObserver(self, forKeyPath: $0) }
48     }
49     
50     dynamic private(set) var ships: [KCShipObject] = []
51     private let deckController: NSObjectController
52     private weak var deck: KCDeck?
53     
54     dynamic var name: String? { return deck?.name }
55     func keyPathsForValuesAffectingName() -> Set<String> {
56         return ["deck.name"]
57     }
58     dynamic var id: NSNumber? { return deck?.id as NSNumber? }
59     func keyPathesForValuesAffectiongId() -> Set<String> {
60         return ["deck.id"]
61     }
62     
63     subscript(_ index: Int) -> KCShipObject? { return deck?[index] }
64     
65     override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
66         if context == &DeckContext {
67             ships = (0..<6).flatMap { return self[$0] }
68             return
69         }
70         super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context)
71     }
72 }