OSDN Git Service

swiftlint 'line_length'の警告を修正
[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 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.entityName
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.entityName,
35                                                 in: deckController.managedObjectContext!)
36         req.predicate = deckController.fetchPredicate
37         do {
38             try deckController.fetch(with: req, merge: false)
39         } catch {
40             print("Fetch error")
41             return nil
42         }
43         deck = deckController.content as? Deck
44         deckObserveKeys.forEach { deckController.addObserver(self, forKeyPath: $0, context: &pDeckContext) }
45     }
46     deinit {
47         deckObserveKeys.forEach { deckController.removeObserver(self, forKeyPath: $0) }
48     }
49     
50     dynamic private(set) var ships: [Ship] = []
51     private let deckController: NSObjectController
52     private weak var deck: Deck?
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) -> Ship? { return deck?[index] }
64     
65     override func observeValue(forKeyPath keyPath: String?,
66                                of object: Any?,
67                                change: [NSKeyValueChangeKey : Any]?,
68                                context: UnsafeMutableRawPointer?) {
69         if context == &pDeckContext {
70             ships = (0..<6).flatMap { return self[$0] }
71             return
72         }
73         super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context)
74     }
75 }