OSDN Git Service

guard の書き方を統一した
[kcd/KCD.git] / KCD / FleetManager.swift
1 //
2 //  FleetManager.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 extension Notification.Name {
12     
13     static let DidPrepareFleet = Notification.Name("com.masakih.KCD.Notification.DidPrepareFleet")
14 }
15
16 final class FleetManager: NSObject {
17     
18     override init() {
19         
20         super.init()
21         
22         setupFleets()
23     }
24     
25     @objc private(set) var fleets: [Fleet] = []
26     private var fleetController: NSArrayController!
27     
28     override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey: Any]?, context: UnsafeMutableRawPointer?) {
29         
30         if keyPath == "arrangedObjects.ships" {
31             
32             setNewFleetNumberToShip()
33             return
34             
35         }
36         
37         super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context)
38     }
39     
40     private func setupFleetController() {
41         
42         fleetController = NSArrayController(content: fleets)
43         fleetController.addObserver(self, forKeyPath: "arrangedObjects.ships", context: nil)
44     }
45     
46     private func setupFleets() {
47         
48         fleets = (1...4).flatMap { Fleet(number: $0) }
49         
50         guard fleets.count == 4 else {
51             
52             print("Can not create Fleet")
53             return
54         }
55         
56         if fleets[0].ships.isEmpty {
57             
58             let center = NotificationCenter.default
59             var token: NSObjectProtocol!
60             token = center.addObserver(forName: .PortAPIReceived, object: nil, queue: nil) {_ in
61                 
62                 center.removeObserver(token)
63                 self.setupFleetController()
64                 center.post(name: .DidPrepareFleet, object: self)
65             }
66             
67         } else {
68             
69             setupFleetController()
70             
71         }
72     }
73     
74     private func setNewFleetNumberToShip() {
75         
76         let store = ServerDataStore.oneTimeEditor()
77         
78         // clear all
79         store.shipsInFleet().forEach { $0.fleet = 0 as NSNumber }
80         
81         // set
82         fleets.enumerated().forEach { (index, fleet) in
83             
84             fleet.ships.forEach {
85                 
86                 store.ship(by: $0.id)?.fleet = (index + 1) as NSNumber
87             }
88         }
89     }
90 }