@@ -29,6 +29,22 @@ internal func plistValueAsNSObject(_ value: Any) -> NSObject? {
29
29
nsValue = NSNumber ( value: val)
30
30
} else if let val = value as? Data {
31
31
nsValue = val. _nsObject
32
+ } else if let val = value as? Date {
33
+ nsValue = val. _nsObject
34
+ } else if let val = value as? [ Any ] {
35
+ var nsValues : [ NSObject ] = [ ]
36
+ for innerValue in val {
37
+ guard let nsInnerValue = plistValueAsNSObject ( innerValue) else { return nil }
38
+ nsValues. append ( nsInnerValue)
39
+ }
40
+ return NSArray ( array: nsValues)
41
+ } else if let val = value as? [ String : Any ] {
42
+ var nsValues : [ String : NSObject ] = [ : ]
43
+ for (key, innerValue) in val {
44
+ guard let nsInnerValue = plistValueAsNSObject ( innerValue) else { return nil }
45
+ nsValues [ key] = nsInnerValue
46
+ }
47
+ return NSDictionary ( dictionary: nsValues)
32
48
} else if let val = value as? NSObject {
33
49
nsValue = val
34
50
} else {
@@ -38,6 +54,48 @@ internal func plistValueAsNSObject(_ value: Any) -> NSObject? {
38
54
return nsValue
39
55
}
40
56
57
+ internal func plistNSObjectAsValue( _ nsValue: NSObject ) -> Any {
58
+ let value : Any
59
+
60
+ // Converts a value to the internal representation. Internalized values are
61
+ // stored as NSObject derived objects in the registration dictionary.
62
+ if let val = nsValue as? NSString {
63
+ value = val. _swiftObject
64
+ } else if let val = nsValue as? NSNumber {
65
+ value = val. _swiftValueOfOptimalType
66
+ } else if let val = nsValue as? NSData {
67
+ value = val. _swiftObject
68
+ } else if let val = nsValue as? NSArray {
69
+ value = val. _swiftObject. map { plistNSObjectAsValue ( $0 as! NSObject ) }
70
+ } else if let val = nsValue as? NSDictionary {
71
+ var values : [ String : Any ] = [ : ]
72
+ for (currentKey, currentInnerValue) in val {
73
+ let key : String
74
+
75
+ if let swiftKey = currentKey as? String {
76
+ key = swiftKey
77
+ } else if let nsKey = currentKey as? NSString {
78
+ key = nsKey. _swiftObject
79
+ } else {
80
+ continue
81
+ }
82
+
83
+ if let nsInnerValue = currentInnerValue as? NSObject {
84
+ values [ key] = plistNSObjectAsValue ( nsInnerValue)
85
+ } else {
86
+ values [ key] = currentInnerValue
87
+ }
88
+ }
89
+ value = values
90
+ } else if let val = nsValue as? NSDate {
91
+ value = val. _swiftObject
92
+ } else {
93
+ value = nsValue
94
+ }
95
+
96
+ return value
97
+ }
98
+
41
99
private extension Dictionary {
42
100
func convertingValuesToNSObjects( ) -> [ Key : NSObject ] ? {
43
101
var result : [ Key : NSObject ] = [ : ]
@@ -63,6 +121,14 @@ private extension Dictionary where Value == NSObject {
63
121
return false
64
122
}
65
123
}
124
+
125
+ func convertingValuesFromPlistNSObject( ) -> [ Key : Any ] {
126
+ var result : [ Key : Any ] = [ : ]
127
+ for (key, value) in self {
128
+ result [ key] = plistNSObjectAsValue ( value)
129
+ }
130
+ return result
131
+ }
66
132
}
67
133
68
134
open class UserDefaults : NSObject {
@@ -354,7 +420,7 @@ open class UserDefaults: NSObject {
354
420
return allDefaults
355
421
}
356
422
357
- private static let _parsedArgumentsDomain : [ String : Any ] = UserDefaults . _parseArguments ( ProcessInfo . processInfo. arguments)
423
+ private static let _parsedArgumentsDomain : [ String : NSObject ] = UserDefaults . _parseArguments ( ProcessInfo . processInfo. arguments) . convertingValuesToNSObjects ( ) ?? [ : ]
358
424
359
425
private var _volatileDomains : [ String : [ String : NSObject ] ] = [ : ]
360
426
private let _volatileDomainsLock = NSLock ( )
@@ -372,7 +438,7 @@ open class UserDefaults: NSObject {
372
438
let domain = _volatileDomains [ domainName]
373
439
_volatileDomainsLock. unlock ( )
374
440
375
- return domain ?? [ : ]
441
+ return domain? . convertingValuesFromPlistNSObject ( ) ?? [ : ]
376
442
}
377
443
378
444
open func setVolatileDomain( _ domain: [ String : Any ] , forName domainName: String ) {
0 commit comments