forked from intitni/CopilotForXcode
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathUserDefaults.swift
More file actions
107 lines (92 loc) · 4.02 KB
/
UserDefaults.swift
File metadata and controls
107 lines (92 loc) · 4.02 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
import Foundation
public extension UserDefaults {
static var shared = UserDefaults(suiteName: "5YKZ4Y3DAW.group.com.intii.CopilotForXcode")!
static func setupDefaultSettings() {
shared.setupDefaultValue(for: \.quitXPCServiceOnXcodeAndAppQuit)
shared.setupDefaultValue(for: \.realtimeSuggestionToggle)
shared.setupDefaultValue(for: \.realtimeSuggestionDebounce)
shared.setupDefaultValue(for: \.automaticallyCheckForUpdate)
shared.setupDefaultValue(for: \.suggestionPresentationMode)
shared.setupDefaultValue(for: \.widgetColorScheme)
}
}
public protocol UserDefaultsStorable {}
extension Int: UserDefaultsStorable {}
extension Double: UserDefaultsStorable {}
extension Bool: UserDefaultsStorable {}
extension String: UserDefaultsStorable {}
extension Data: UserDefaultsStorable {}
extension URL: UserDefaultsStorable {}
public extension UserDefaults {
// MARK: - Normal Types
func value<K: UserDefaultPreferenceKey>(
for keyPath: KeyPath<UserDefaultPreferenceKeys, K>
) -> K.Value where K.Value: UserDefaultsStorable {
let key = UserDefaultPreferenceKeys()[keyPath: keyPath]
return (value(forKey: key.key) as? K.Value) ?? key.defaultValue
}
func set<K: UserDefaultPreferenceKey>(
_ value: K.Value,
for keyPath: KeyPath<UserDefaultPreferenceKeys, K>
) where K.Value: UserDefaultsStorable {
let key = UserDefaultPreferenceKeys()[keyPath: keyPath]
set(value, forKey: key.key)
}
func setupDefaultValue<K: UserDefaultPreferenceKey>(
for keyPath: KeyPath<UserDefaultPreferenceKeys, K>
) where K.Value: UserDefaultsStorable {
let key = UserDefaultPreferenceKeys()[keyPath: keyPath]
if value(forKey: key.key) == nil {
set(key.defaultValue, forKey: key.key)
}
}
// MARK: - Raw Representable
func value<K: UserDefaultPreferenceKey>(
for keyPath: KeyPath<UserDefaultPreferenceKeys, K>
) -> K.Value where K.Value: RawRepresentable, K.Value.RawValue == String {
let key = UserDefaultPreferenceKeys()[keyPath: keyPath]
guard let rawValue = value(forKey: key.key) as? String else {
return key.defaultValue
}
return K.Value(rawValue: rawValue) ?? key.defaultValue
}
func value<K: UserDefaultPreferenceKey>(
for keyPath: KeyPath<UserDefaultPreferenceKeys, K>
) -> K.Value where K.Value: RawRepresentable, K.Value.RawValue == Int {
let key = UserDefaultPreferenceKeys()[keyPath: keyPath]
guard let rawValue = value(forKey: key.key) as? Int else {
return key.defaultValue
}
return K.Value(rawValue: rawValue) ?? key.defaultValue
}
func set<K: UserDefaultPreferenceKey>(
_ value: K.Value,
for keyPath: KeyPath<UserDefaultPreferenceKeys, K>
) where K.Value: RawRepresentable, K.Value.RawValue == String {
let key = UserDefaultPreferenceKeys()[keyPath: keyPath]
set(value.rawValue, forKey: key.key)
}
func set<K: UserDefaultPreferenceKey>(
_ value: K.Value,
for keyPath: KeyPath<UserDefaultPreferenceKeys, K>
) where K.Value: RawRepresentable, K.Value.RawValue == Int {
let key = UserDefaultPreferenceKeys()[keyPath: keyPath]
set(value.rawValue, forKey: key.key)
}
func setupDefaultValue<K: UserDefaultPreferenceKey>(
for keyPath: KeyPath<UserDefaultPreferenceKeys, K>
) where K.Value: RawRepresentable, K.Value.RawValue == String {
let key = UserDefaultPreferenceKeys()[keyPath: keyPath]
if value(forKey: key.key) == nil {
set(key.defaultValue.rawValue, forKey: key.key)
}
}
func setupDefaultValue<K: UserDefaultPreferenceKey>(
for keyPath: KeyPath<UserDefaultPreferenceKeys, K>
) where K.Value: RawRepresentable, K.Value.RawValue == Int {
let key = UserDefaultPreferenceKeys()[keyPath: keyPath]
if value(forKey: key.key) == nil {
set(key.defaultValue.rawValue, forKey: key.key)
}
}
}