OSDN Git Service

Doutakuを導入
[kcd/KCD.git] / KCD / DefaultKeyExtendedValues.swift
1 //
2 //  DefaultKeyExtendedValues.swift
3 //  KCD
4 //
5 //  Created by Hori,Masaki on 2017/07/31.
6 //  Copyright © 2017年 Hori,Masaki. All rights reserved.
7 //
8
9 import Foundation
10 import AppKit.NSColor
11
12 /// KeyedArchiving
13 extension UserDefaults {
14     
15     private func keyedArchivedObject<T>(forKey key: String) -> T? {
16         
17         guard let data = self.object(forKey: key) as? Data else { return nil }
18         
19         return NSKeyedUnarchiver.unarchiveObject(with: data) as? T
20     }
21     
22     private func setKeyedArchived(_ object: Any?, forKey key: String) {
23         
24         guard let object = object else {
25             
26             self.removeObject(forKey: key)
27             return
28         }
29         
30         let data = NSKeyedArchiver.archivedData(withRootObject: object)
31         self.set(data, forKey: key)
32     }
33     
34 }
35
36 extension UserDefaults {
37     
38     subscript(key: DefaultKey<[NSSortDescriptor]>) -> [NSSortDescriptor] {
39         
40         get { return keyedArchivedObject(forKey: key.rawValue) ?? [] }
41         set { self.setKeyedArchived(newValue, forKey: key.rawValue) }
42     }
43     
44     subscript(key: DefaultKey<NSColor>) -> NSColor {
45         
46         get { return keyedArchivedObject(forKey: key.rawValue) ?? key.alternative }
47         set { self.setKeyedArchived(newValue, forKey: key.rawValue) }
48     }
49     
50     subscript(key: DefaultKey<Date>) -> Date {
51         
52         get { return keyedArchivedObject(forKey: key.rawValue) ?? key.alternative }
53         set { self.setKeyedArchived(newValue, forKey: key.rawValue) }
54     }
55     
56 }
57
58 /// Enumlation Values
59 extension UserDefaults {
60     
61     subscript(key: DefaultKey<Debug.Level>) -> Debug.Level {
62         
63         get { return Debug.Level(rawValue: self.integer(forKey: key.rawValue)) ?? key.alternative }
64         set { self.set(newValue.rawValue, forKey: key.rawValue) }
65     }
66     
67     subscript(key: DefaultKey<FleetViewController.SakutekiCalclationSterategy>) -> FleetViewController.SakutekiCalclationSterategy {
68         
69         get { return FleetViewController.SakutekiCalclationSterategy(rawValue: self.integer(forKey: key.rawValue)) ?? key.alternative }
70         set { self.set(newValue.rawValue, forKey: key.rawValue) }
71     }
72     
73     subscript(key: DefaultKey<SlotItemWindowController.ShowType>) -> SlotItemWindowController.ShowType {
74         
75         get { return SlotItemWindowController.ShowType(rawValue: self.integer(forKey: key.rawValue)) ?? key.alternative }
76         set { self.set(newValue.rawValue, forKey: key.rawValue) }
77     }
78     
79     subscript(key: DefaultKey<BroserWindowController.FleetViewPosition>) -> BroserWindowController.FleetViewPosition {
80         
81         get { return BroserWindowController.FleetViewPosition(rawValue: self.integer(forKey: key.rawValue)) ?? key.alternative }
82         set { self.set(newValue.rawValue, forKey: key.rawValue) }
83     }
84     
85     subscript(key: DefaultKey<FleetViewController.ShipOrder>) -> FleetViewController.ShipOrder {
86         
87         get { return FleetViewController.ShipOrder(rawValue: self.integer(forKey: key.rawValue)) ??  key.alternative }
88         set { self.set(newValue.rawValue, forKey: key.rawValue) }
89     }
90     
91     subscript(key: DefaultKey<NSControl.ControlSize>) -> NSControl.ControlSize {
92         
93         get { return NSControl.ControlSize(rawValue: UInt(self.integer(forKey: key.rawValue))) ?? key.alternative }
94         set { self.set(newValue.rawValue, forKey: key.rawValue) }
95     }
96     
97 }