OSDN Git Service

Doutakuを導入
[kcd/KCD.git] / KCD / PowerUpSupportViewController.swift
index 3f0d8bf..ad88567 100644 (file)
@@ -8,68 +8,72 @@
 
 import Cocoa
 
-class PowerUpSupportViewController: MainTabVIewItemViewController {
-    let managedObjectContext = ServerDataStore.default.context
+final class PowerUpSupportViewController: MainTabVIewItemViewController {
     
-    deinit {
-        shipController.removeObserver(self, forKeyPath: NSSortDescriptorsBinding)
-    }
+    @objc let managedObjectContext = ServerDataStore.default.context
+    
+    @IBOutlet private var shipController: NSArrayController!
+    @IBOutlet private weak var typeSegment: NSSegmentedControl!
     
-    @IBOutlet var shipController: NSArrayController!
-    @IBOutlet weak var typeSegment: NSSegmentedControl!
+    private var sortDescriptorsObservation: NSKeyValueObservation?
     
     override var hasShipTypeSelector: Bool { return true }
-    override var selectedShipType: ShipType {
+    override var selectedShipType: ShipTabType {
+        
         didSet {
             shipController.filterPredicate = customPredicate()
             shipController.rearrangeObjects()
         }
     }
-    override var nibName: String! {
-        return "PowerUpSupportViewController"
+    
+    override var nibName: NSNib.Name {
+        
+        return .nibName(instanceOf: self)
     }
     
     var omitPredicate: NSPredicate? {
+        
         let sd = UserDefaults.standard
-        let hideKyes = [(Bool, String)]()
-            .appended { (sd.hideMaxKaryoku, "isMaxKaryoku != TRUE") }
-            .appended { (sd.hideMaxRaisou, "isMaxRaisou != TRUE") }
-            .appended { (sd.hideMaxTaiku, "isMaxTaiku != TRUE") }
-            .appended { (sd.hideMaxSoukou, "isMaxSoukou != TRUE") }
-            .appended { (sd.hideMaxLucky, "isMaxLucky != TRUE") }
-            .flatMap { (b, s) in b ? s : nil }
-        if hideKyes.isEmpty { return nil }
-        return NSPredicate(format: hideKyes.joined(separator: " AND "))
+        let predicates = [(Bool, NSPredicate)]()
+            .appended { (sd[.hideMaxKaryoku], .false(#keyPath(Ship.isMaxKaryoku))) }
+            .appended { (sd[.hideMaxRaisou], .false(#keyPath(Ship.isMaxRaisou))) }
+            .appended { (sd[.hideMaxTaiku], .false(#keyPath(Ship.isMaxTaiku))) }
+            .appended { (sd[.hideMaxSoukou], .false(#keyPath(Ship.isMaxSoukou))) }
+            .appended { (sd[.hideMaxLucky], .false(#keyPath(Ship.isMaxLucky))) }
+            .compactMap { (b, s) in b ? s : nil }
+        
+        if predicates.isEmpty { return nil }
+        
+        return .and(predicates)
     }
     
     override func viewDidLoad() {
+        
         super.viewDidLoad()
         
         changeCategory(nil)
+        
         do {
+            
             try shipController.fetch(with: nil, merge: true)
+            
         } catch {
+            
             fatalError("PowerUpSupportViewController: can not fetch. \(error)")
         }
-        shipController.sortDescriptors = UserDefaults.standard.powerupSupportSortDecriptors
-        shipController.addObserver(self, forKeyPath: NSSortDescriptorsBinding, context: nil)
-    }
-    
-    override func observeValue(forKeyPath keyPath: String?,
-                               of object: Any?,
-                               change: [NSKeyValueChangeKey : Any]?,
-                               context: UnsafeMutableRawPointer?) {
-        if keyPath == NSSortDescriptorsBinding {
-            UserDefaults.standard.powerupSupportSortDecriptors = shipController.sortDescriptors
-            return
-        }
         
-        super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context)
+        shipController.sortDescriptors = UserDefaults.standard[.powerupSupportSortDecriptors]
+        sortDescriptorsObservation = shipController.observe(\NSArrayController.sortDescriptors) { [weak self] _, _ in
+            
+            UserDefaults.standard[.powerupSupportSortDecriptors] = self?.shipController.sortDescriptors ?? []
+        }
     }
     
-    fileprivate func customPredicate() -> NSPredicate? {
-        switch (shipTypePredicte, omitPredicate) {
-        case let (s?, o?): return NSCompoundPredicate(type: .and, subpredicates: [o, s])
+    private func customPredicate() -> NSPredicate? {
+        
+        switch (shipTypePredicte(for: selectedShipType), omitPredicate) {
+            
+        case let (s?, o?): return .and([o, s])
         case let (s?, nil): return s
         case let (nil, o?): return o
         default: return nil
@@ -77,6 +81,7 @@ class PowerUpSupportViewController: MainTabVIewItemViewController {
     }
     
     @IBAction func changeCategory(_ sender: AnyObject?) {
-        ShipType(rawValue: typeSegment.selectedSegment).map { selectedShipType = $0 }
+        
+        ShipTabType(rawValue: typeSegment.selectedSegment).map { selectedShipType = $0 }
     }
 }