OSDN Git Service

ApplicationDirecroriesの中のアプリケーションに依存する部分を分離した
[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 {
18             
19             return nil
20         }
21         
22         return NSKeyedUnarchiver.unarchiveObject(with: data) as? T
23     }
24     
25     private func setKeyedArchived(_ object: Any?, forKey key: String) {
26         
27         guard let object = object else {
28             
29             self.removeObject(forKey: key)
30             
31             return
32         }
33         
34         let data = NSKeyedArchiver.archivedData(withRootObject: object)
35         self.set(data, forKey: key)
36     }
37     
38 }
39
40 extension UserDefaults {
41     
42     subscript(key: DefaultKey<[NSSortDescriptor]>) -> [NSSortDescriptor] {
43         
44         get { return keyedArchivedObject(forKey: key.rawValue) ?? [] }
45         set { self.setKeyedArchived(newValue, forKey: key.rawValue) }
46     }
47     
48     subscript(key: DefaultKey<NSColor>) -> NSColor {
49         
50         get { return keyedArchivedObject(forKey: key.rawValue) ?? key.alternative }
51         set { self.setKeyedArchived(newValue, forKey: key.rawValue) }
52     }
53     
54     subscript(key: DefaultKey<Date>) -> Date {
55         
56         get { return keyedArchivedObject(forKey: key.rawValue) ?? key.alternative }
57         set { self.setKeyedArchived(newValue, forKey: key.rawValue) }
58     }
59     
60 }
61
62 /// Enumlation Values
63 extension UserDefaults {
64     
65     subscript(key: DefaultKey<Debug.Level>) -> Debug.Level {
66         
67         get { return Debug.Level(rawValue: self.integer(forKey: key.rawValue)) ?? key.alternative }
68         set { self.set(newValue.rawValue, forKey: key.rawValue) }
69     }
70     
71     subscript(key: DefaultKey<FleetViewController.SakutekiCalclationSterategy>) -> FleetViewController.SakutekiCalclationSterategy {
72         
73         get { return FleetViewController.SakutekiCalclationSterategy(rawValue: self.integer(forKey: key.rawValue)) ?? key.alternative }
74         set { self.set(newValue.rawValue, forKey: key.rawValue) }
75     }
76     
77     subscript(key: DefaultKey<SlotItemWindowController.ShowType>) -> SlotItemWindowController.ShowType {
78         
79         get { return SlotItemWindowController.ShowType(rawValue: self.integer(forKey: key.rawValue)) ?? key.alternative }
80         set { self.set(newValue.rawValue, forKey: key.rawValue) }
81     }
82     
83     subscript(key: DefaultKey<BroserWindowController.FleetViewPosition>) -> BroserWindowController.FleetViewPosition {
84         
85         get { return BroserWindowController.FleetViewPosition(rawValue: self.integer(forKey: key.rawValue)) ?? key.alternative }
86         set { self.set(newValue.rawValue, forKey: key.rawValue) }
87     }
88     
89     subscript(key: DefaultKey<FleetViewController.ShipOrder>) -> FleetViewController.ShipOrder {
90         
91         get { return FleetViewController.ShipOrder(rawValue: self.integer(forKey: key.rawValue)) ??  key.alternative }
92         set { self.set(newValue.rawValue, forKey: key.rawValue) }
93     }
94     
95     subscript(key: DefaultKey<NSControl.ControlSize>) -> NSControl.ControlSize {
96         
97         get { return NSControl.ControlSize(rawValue: UInt(self.integer(forKey: key.rawValue))) ?? key.alternative }
98         set { self.set(newValue.rawValue, forKey: key.rawValue) }
99     }
100     
101 }