Skip to content

Commit aa504dc

Browse files
committed
NSKeyedArchiver, NSKeyedUnarchiver now use Any instead of AnyObject.
This also fixes the NSKeyedArchiver tests for macOS, which were probably failing because of assumptions made in the implementation about AnyObject. To help reduce the amount of casting in the implementation, this commit adds a private NS "toll free bridged" type for the private CF type used as a keyed archiver UID in CFPropertyList.
1 parent 9cf67d2 commit aa504dc

13 files changed

+196
-180
lines changed

Foundation.xcodeproj/project.pbxproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -306,6 +306,7 @@
306306
E1A03F361C4828650023AF4D /* PropertyList-1.0.dtd in Resources */ = {isa = PBXBuildFile; fileRef = E1A03F351C4828650023AF4D /* PropertyList-1.0.dtd */; };
307307
E1A03F381C482C730023AF4D /* NSXMLDTDTestData.xml in Resources */ = {isa = PBXBuildFile; fileRef = E1A03F371C482C730023AF4D /* NSXMLDTDTestData.xml */; };
308308
E1A3726F1C31EBFB0023AF4D /* NSXMLDocumentTestData.xml in Resources */ = {isa = PBXBuildFile; fileRef = E1A3726E1C31EBFB0023AF4D /* NSXMLDocumentTestData.xml */; };
309+
EA418C261D57257D005EAD0D /* NSKeyedArchiverHelpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA418C251D57257D005EAD0D /* NSKeyedArchiverHelpers.swift */; };
309310
EA66F6361BEED03E00136161 /* TargetConditionals.h in Headers */ = {isa = PBXBuildFile; fileRef = EA66F6351BEED03E00136161 /* TargetConditionals.h */; settings = {ATTRIBUTES = (Public, ); }; };
310311
EA66F6481BF1619600136161 /* NSURLTestData.plist in Resources */ = {isa = PBXBuildFile; fileRef = EA66F63B1BF1619600136161 /* NSURLTestData.plist */; };
311312
EA66F6671BF2F2F100136161 /* CoreFoundation.h in Headers */ = {isa = PBXBuildFile; fileRef = EA66F6651BF2F2E800136161 /* CoreFoundation.h */; settings = {ATTRIBUTES = (Public, ); }; };
@@ -723,6 +724,7 @@
723724
EA313DFD1BE7F2E90060A403 /* CFURLComponents_URIParser.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = CFURLComponents_URIParser.c; sourceTree = "<group>"; };
724725
EA313DFE1BE7F2E90060A403 /* CFURLComponents.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = CFURLComponents.c; sourceTree = "<group>"; };
725726
EA313DFF1BE7F2E90060A403 /* CFURLComponents.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CFURLComponents.h; sourceTree = "<group>"; };
727+
EA418C251D57257D005EAD0D /* NSKeyedArchiverHelpers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NSKeyedArchiverHelpers.swift; sourceTree = "<group>"; };
726728
EA66F6351BEED03E00136161 /* TargetConditionals.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TargetConditionals.h; path = CoreFoundation/Base.subproj/SwiftRuntime/TargetConditionals.h; sourceTree = SOURCE_ROOT; };
727729
EA66F6381BF1619600136161 /* main.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = "<group>"; };
728730
EA66F63B1BF1619600136161 /* NSURLTestData.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = NSURLTestData.plist; sourceTree = "<group>"; };
@@ -1418,6 +1420,7 @@
14181420
EADE0B651BD15DFF00C49C64 /* NSKeyedArchiver.swift */,
14191421
D3BCEB9F1C2F6DDB00295652 /* NSKeyedCoderOldStyleArray.swift */,
14201422
D39A14001C2D6E0A00295652 /* NSKeyedUnarchiver.swift */,
1423+
EA418C251D57257D005EAD0D /* NSKeyedArchiverHelpers.swift */,
14211424
5BDC3F321BCC5DCB00ED97BB /* NSCoder.swift */,
14221425
5BDC3F421BCC5DCB00ED97BB /* NSPropertyList.swift */,
14231426
);
@@ -1954,6 +1957,7 @@
19541957
EADE0BC71BD15E0000C49C64 /* NSXMLDocument.swift in Sources */,
19551958
5BDC3FCE1BCF17D300ED97BB /* NSCFDictionary.swift in Sources */,
19561959
EADE0BA81BD15E0000C49C64 /* NSNotificationQueue.swift in Sources */,
1960+
EA418C261D57257D005EAD0D /* NSKeyedArchiverHelpers.swift in Sources */,
19571961
EADE0B981BD15DFF00C49C64 /* NSDecimalNumber.swift in Sources */,
19581962
5BA9BEA61CF3D747009DBD6C /* Data.swift in Sources */,
19591963
5BF7AEA71BCD51F9008F214A /* NSCoder.swift in Sources */,

Foundation/NSArray.swift

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,19 +74,20 @@ open class NSArray : NSObject, NSCopying, NSMutableCopying, NSSecureCoding, NSCo
7474
}
7575
let objects = UnsafeMutablePointer<AnyObject?>.allocate(capacity: Int(cnt))
7676
for idx in 0..<cnt {
77-
objects.advanced(by: Int(idx)).initialize(to: aDecoder.decodeObject())
77+
// If conversion to NSObject fails then we really can't hold it anyway
78+
objects.advanced(by: Int(idx)).initialize(to: aDecoder.decodeObject() as! NSObject)
7879
}
7980
self.init(objects: UnsafePointer<AnyObject?>(objects), count: Int(cnt))
8081
objects.deinitialize(count: Int(cnt))
8182
objects.deallocate(capacity: Int(cnt))
8283
} else if type(of: aDecoder) == NSKeyedUnarchiver.self || aDecoder.containsValue(forKey: "NS.objects") {
8384
let objects = aDecoder._decodeArrayOfObjectsForKey("NS.objects")
84-
self.init(array: objects)
85+
self.init(array: objects as! [NSObject])
8586
} else {
8687
var objects = [AnyObject]()
8788
var count = 0
8889
while let object = aDecoder.decodeObject(forKey: "NS.object.\(count)") {
89-
objects.append(object)
90+
objects.append(object as! NSObject)
9091
count += 1
9192
}
9293
self.init(array: objects)

Foundation/NSCoder.swift

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -61,15 +61,15 @@ open class NSCoder : NSObject {
6161
be casted to NSObject, nor is it Hashable.
6262
*/
6363
/// - Experiment: This is a draft API currently under consideration for official import into Foundation
64-
open func decodeObjectOfClasses(_ classes: [AnyClass], forKey key: String) -> AnyObject? {
64+
open func decodeObjectOfClasses(_ classes: [AnyClass], forKey key: String) -> Any? {
6565
NSUnimplemented()
6666
}
6767

68-
open func decodeTopLevelObject() throws -> AnyObject? {
68+
open func decodeTopLevelObject() throws -> Any? {
6969
NSUnimplemented()
7070
}
7171

72-
open func decodeTopLevelObjectForKey(_ key: String) throws -> AnyObject? {
72+
open func decodeTopLevelObjectForKey(_ key: String) throws -> Any? {
7373
NSUnimplemented()
7474
}
7575

@@ -88,7 +88,7 @@ open class NSCoder : NSObject {
8888
be casted to NSObject, nor is it Hashable.
8989
*/
9090
/// - Experiment: This is a draft API currently under consideration for official import into Foundation
91-
open func decodeTopLevelObjectOfClasses(_ classes: [AnyClass], forKey key: String) throws -> AnyObject? {
91+
open func decodeTopLevelObjectOfClasses(_ classes: [AnyClass], forKey key: String) throws -> Any? {
9292
NSUnimplemented()
9393
}
9494

@@ -97,26 +97,26 @@ open class NSCoder : NSObject {
9797
}
9898

9999

100-
open func encode(_ object: AnyObject?) {
100+
open func encode(_ object: Any?) {
101101
var object = object
102-
withUnsafePointer(to: &object) { (ptr: UnsafePointer<AnyObject?>) -> Void in
102+
withUnsafePointer(to: &object) { (ptr: UnsafePointer<Any?>) -> Void in
103103
encodeValue(ofObjCType: "@", at: unsafeBitCast(ptr, to: UnsafeRawPointer.self))
104104
}
105105
}
106106

107-
open func encodeRootObject(_ rootObject: AnyObject) {
107+
open func encodeRootObject(_ rootObject: Any) {
108108
encode(rootObject)
109109
}
110110

111-
open func encodeBycopyObject(_ anObject: AnyObject?) {
111+
open func encodeBycopyObject(_ anObject: Any?) {
112112
encode(anObject)
113113
}
114114

115-
open func encodeByrefObject(_ anObject: AnyObject?) {
115+
open func encodeByrefObject(_ anObject: Any?) {
116116
encode(anObject)
117117
}
118118

119-
open func encodeConditionalObject(_ object: AnyObject?) {
119+
open func encodeConditionalObject(_ object: Any?) {
120120
encode(object)
121121
}
122122

@@ -135,13 +135,13 @@ open class NSCoder : NSObject {
135135
}
136136
}
137137

138-
open func decodeObject() -> AnyObject? {
138+
open func decodeObject() -> Any? {
139139
if self.error != nil {
140140
return nil
141141
}
142142

143-
var obj: AnyObject? = nil
144-
withUnsafeMutablePointer(to: &obj) { (ptr: UnsafeMutablePointer<AnyObject?>) -> Void in
143+
var obj: Any? = nil
144+
withUnsafeMutablePointer(to: &obj) { (ptr: UnsafeMutablePointer<Any?>) -> Void in
145145
decodeValue(ofObjCType: "@", at: unsafeBitCast(ptr, to: UnsafeMutableRawPointer.self))
146146
}
147147
return obj
@@ -167,11 +167,11 @@ open class NSCoder : NSObject {
167167
}
168168
*/
169169

170-
open func encodePropertyList(_ aPropertyList: AnyObject) {
170+
open func encodePropertyList(_ aPropertyList: Any) {
171171
NSUnimplemented()
172172
}
173173

174-
open func decodePropertyList() -> AnyObject? {
174+
open func decodePropertyList() -> Any? {
175175
NSUnimplemented()
176176
}
177177

@@ -183,11 +183,11 @@ open class NSCoder : NSObject {
183183
return false
184184
}
185185

186-
open func encode(_ objv: AnyObject?, forKey key: String) {
186+
open func encode(_ objv: Any?, forKey key: String) {
187187
NSRequiresConcreteImplementation()
188188
}
189189

190-
open func encodeConditionalObject(_ objv: AnyObject?, forKey key: String) {
190+
open func encodeConditionalObject(_ objv: Any?, forKey key: String) {
191191
NSRequiresConcreteImplementation()
192192
}
193193

@@ -219,7 +219,7 @@ open class NSCoder : NSObject {
219219
NSRequiresConcreteImplementation()
220220
}
221221

222-
open func decodeObject(forKey key: String) -> AnyObject? {
222+
open func decodeObject(forKey key: String) -> Any? {
223223
NSRequiresConcreteImplementation()
224224
}
225225

@@ -266,7 +266,7 @@ open class NSCoder : NSObject {
266266
return false
267267
}
268268

269-
open func decodePropertyListForKey(_ key: String) -> AnyObject? {
269+
open func decodePropertyListForKey(_ key: String) -> Any? {
270270
NSUnimplemented()
271271
}
272272

@@ -290,7 +290,7 @@ open class NSCoder : NSObject {
290290
}
291291
}
292292

293-
internal func _decodeArrayOfObjectsForKey(_ key: String) -> [AnyObject] {
293+
internal func _decodeArrayOfObjectsForKey(_ key: String) -> [Any] {
294294
NSRequiresConcreteImplementation()
295295
}
296296

Foundation/NSDictionary.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ open class NSDictionary : NSObject, NSCopying, NSMutableCopying, NSSecureCoding,
132132
let objects = UnsafeMutablePointer<AnyObject>.allocate(capacity: Int(cnt))
133133
for idx in 0..<cnt {
134134
keys.advanced(by: Int(idx)).initialize(to: aDecoder.decodeObject()! as! NSObject)
135-
objects.advanced(by: Int(idx)).initialize(to: aDecoder.decodeObject()!)
135+
objects.advanced(by: Int(idx)).initialize(to: aDecoder.decodeObject()! as! NSObject)
136136
}
137137
self.init(objects: UnsafePointer<AnyObject>(objects), forKeys: UnsafePointer<NSObject>(keys), count: Int(cnt))
138138
keys.deinitialize(count: Int(cnt))
@@ -143,15 +143,15 @@ open class NSDictionary : NSObject, NSCopying, NSMutableCopying, NSSecureCoding,
143143
} else if type(of: aDecoder) == NSKeyedUnarchiver.self || aDecoder.containsValue(forKey: "NS.objects") {
144144
let keys = aDecoder._decodeArrayOfObjectsForKey("NS.keys").map() { return $0 as! NSObject }
145145
let objects = aDecoder._decodeArrayOfObjectsForKey("NS.objects")
146-
self.init(objects: objects, forKeys: keys)
146+
self.init(objects: objects as! [NSObject], forKeys: keys)
147147
} else {
148148
var objects = [AnyObject]()
149149
var keys = [NSObject]()
150150
var count = 0
151151
while let key = aDecoder.decodeObject(forKey: "NS.key.\(count)"),
152152
let object = aDecoder.decodeObject(forKey: "NS.object.\(count)") {
153153
keys.append(key as! NSObject)
154-
objects.append(object)
154+
objects.append(object as! NSObject)
155155
count += 1
156156
}
157157
self.init(objects: objects, forKeys: keys)

0 commit comments

Comments
 (0)