diff --git a/Foundation/NSCalendar.swift b/Foundation/NSCalendar.swift index 5021c60a41..39a694e71d 100644 --- a/Foundation/NSCalendar.swift +++ b/Foundation/NSCalendar.swift @@ -135,21 +135,21 @@ open class NSCalendar : NSObject, NSCopying, NSSecureCoding { public convenience required init?(coder aDecoder: NSCoder) { if aDecoder.allowsKeyedCoding { - guard let calendarIdentifier = aDecoder.decodeObjectOfClass(NSString.self, forKey: "NS.identifier") else { + guard let calendarIdentifier = aDecoder.decodeObject(of: NSString.self, forKey: "NS.identifier") else { return nil } self.init(identifier: NSCalendar.Identifier.init(rawValue: calendarIdentifier._swiftObject)) - if let timeZone = aDecoder.decodeObjectOfClass(NSTimeZone.self, forKey: "NS.timezone") { + if let timeZone = aDecoder.decodeObject(of: NSTimeZone.self, forKey: "NS.timezone") { self.timeZone = timeZone._swiftObject } - if let locale = aDecoder.decodeObjectOfClass(NSLocale.self, forKey: "NS.locale") { + if let locale = aDecoder.decodeObject(of: NSLocale.self, forKey: "NS.locale") { self.locale = locale._swiftObject } self.firstWeekday = aDecoder.decodeInteger(forKey: "NS.firstwkdy") self.minimumDaysInFirstWeek = aDecoder.decodeInteger(forKey: "NS.mindays") - if let startDate = aDecoder.decodeObjectOfClass(NSDate.self, forKey: "NS.gstartdate") { + if let startDate = aDecoder.decodeObject(of: NSDate.self, forKey: "NS.gstartdate") { self._startDate = startDate._swiftObject } } else { @@ -1385,8 +1385,8 @@ open class NSDateComponents : NSObject, NSCopying, NSSecureCoding { self.weekday = aDecoder.decodeInteger(forKey: "NS.weekday") self.weekdayOrdinal = aDecoder.decodeInteger(forKey: "NS.weekdayOrdinal") self.isLeapMonth = aDecoder.decodeBool(forKey: "NS.isLeapMonth") - self.calendar = aDecoder.decodeObjectOfClass(NSCalendar.self, forKey: "NS.calendar")?._swiftObject - self.timeZone = aDecoder.decodeObjectOfClass(NSTimeZone.self, forKey: "NS.timezone")?._swiftObject + self.calendar = aDecoder.decodeObject(of: NSCalendar.self, forKey: "NS.calendar")?._swiftObject + self.timeZone = aDecoder.decodeObject(of: NSTimeZone.self, forKey: "NS.timezone")?._swiftObject } else { NSUnimplemented() } diff --git a/Foundation/NSCoder.swift b/Foundation/NSCoder.swift index 6c0ca4f73a..4f8ba4df9e 100644 --- a/Foundation/NSCoder.swift +++ b/Foundation/NSCoder.swift @@ -7,6 +7,16 @@ // See http://swift.org/CONTRIBUTORS.txt for the list of Swift project authors // +extension NSCoder { + /*! + Describes the action an NSCoder should take when it encounters decode failures (e.g. corrupt data) for non-TopLevel decodes. Darwin platfrom supports exceptions here, and there may be other approaches supported in the future, so its included for completeness. + */ + public enum DecodingFailurePolicy : Int { + case setErrorAndReturn + } +} + + public protocol NSCoding { func encode(with aCoder: NSCoder) init?(coder aDecoder: NSCoder) @@ -30,7 +40,7 @@ open class NSCoder : NSObject { NSRequiresConcreteImplementation() } - open func encodeDataObject(_ data: Data) { + open func encode(_ data: Data) { NSRequiresConcreteImplementation() } @@ -38,7 +48,7 @@ open class NSCoder : NSObject { NSRequiresConcreteImplementation() } - open func decodeDataObject() -> Data? { + open func decodeData() -> Data? { NSRequiresConcreteImplementation() } @@ -46,7 +56,7 @@ open class NSCoder : NSObject { NSRequiresConcreteImplementation() } - open func decodeObjectOfClass(_ cls: DecodedObjectType.Type, forKey key: String) -> DecodedObjectType? where DecodedObjectType : NSObject { + open func decodeObject(of cls: DecodedObjectType.Type, forKey key: String) -> DecodedObjectType? where DecodedObjectType: NSObject { NSUnimplemented() } @@ -60,8 +70,7 @@ open class NSCoder : NSObject { classes is an array of Classes, not a NSSet. This is because AnyClass cannot be casted to NSObject, nor is it Hashable. */ - /// - Experiment: This is a draft API currently under consideration for official import into Foundation - open func decodeObjectOfClasses(_ classes: [AnyClass], forKey key: String) -> Any? { + open func decodeObject(of classes: [AnyClass]?, forKey key: String) -> Any? { NSUnimplemented() } @@ -69,11 +78,11 @@ open class NSCoder : NSObject { NSUnimplemented() } - open func decodeTopLevelObjectForKey(_ key: String) throws -> Any? { + open func decodeTopLevelObject(forKey key: String) throws -> Any? { NSUnimplemented() } - open func decodeTopLevelObjectOfClass(_ cls: DecodedObjectType.Type, forKey key: String) throws -> DecodedObjectType? where DecodedObjectType : NSObject { + open func decodeTopLevelObject(of cls: DecodedObjectType.Type, forKey key: String) throws -> DecodedObjectType? where DecodedObjectType: NSObject { NSUnimplemented() } @@ -87,16 +96,10 @@ open class NSCoder : NSObject { classes is an array of Classes, not a NSSet. This is because AnyClass cannot be casted to NSObject, nor is it Hashable. */ - /// - Experiment: This is a draft API currently under consideration for official import into Foundation - open func decodeTopLevelObjectOfClasses(_ classes: [AnyClass], forKey key: String) throws -> Any? { + open func decodeTopLevelObject(of classes: [AnyClass], forKey key: String) throws -> Any? { NSUnimplemented() } - internal var error: NSError? { - return nil - } - - open func encode(_ object: Any?) { var object = object withUnsafePointer(to: &object) { (ptr: UnsafePointer) -> Void in @@ -227,6 +230,12 @@ open class NSCoder : NSObject { NSRequiresConcreteImplementation() } + // NOTE: this equivalent to the decodeIntForKey: in Objective-C implementation + open func decodeCInt(forKey key: String) -> Int32 { + + NSRequiresConcreteImplementation() + } + open func decodeInt32(forKey key: String) -> Int32 { NSRequiresConcreteImplementation() } @@ -282,12 +291,21 @@ open class NSCoder : NSObject { NSUnimplemented() } - open func failWithError(_ error: NSError) { - if let debugDescription = error.userInfo["NSDebugDescription"] { - NSLog("*** NSKeyedUnarchiver.init: \(debugDescription)") - } else { - NSLog("*** NSKeyedUnarchiver.init: decoding error") - } + open func failWithError(_ error: Error) { + NSUnimplemented() + // NOTE: disabled for now due to bridging uncertainty + // if let debugDescription = error.userInfo["NSDebugDescription"] { + // NSLog("*** NSKeyedUnarchiver.init: \(debugDescription)") + // } else { + // NSLog("*** NSKeyedUnarchiver.init: decoding error") + // } + } + + open var decodingFailurePolicy: NSCoder.DecodingFailurePolicy { + return .setErrorAndReturn + } + open var error: Error? { + NSRequiresConcreteImplementation() } internal func _decodeArrayOfObjectsForKey(_ key: String) -> [Any] { diff --git a/Foundation/NSData.swift b/Foundation/NSData.swift index b0ced60576..bfa91a05a2 100644 --- a/Foundation/NSData.swift +++ b/Foundation/NSData.swift @@ -169,7 +169,7 @@ open class NSData : NSObject, NSCopying, NSMutableCopying, NSSecureCoding { public required convenience init?(coder aDecoder: NSCoder) { if !aDecoder.allowsKeyedCoding { - if let data = aDecoder.decodeDataObject() { + if let data = aDecoder.decodeData() { self.init(data: data) } else { return nil diff --git a/Foundation/NSDate.swift b/Foundation/NSDate.swift index e0bc7cdb26..83b4f528b6 100644 --- a/Foundation/NSDate.swift +++ b/Foundation/NSDate.swift @@ -278,11 +278,11 @@ open class NSDateInterval : NSObject, NSCopying, NSSecureCoding { public required convenience init?(coder: NSCoder) { precondition(coder.allowsKeyedCoding) - guard let start = coder.decodeObjectOfClass(NSDate.self, forKey: "NS.startDate") else { + guard let start = coder.decodeObject(of: NSDate.self, forKey: "NS.startDate") else { coder.failWithError(NSError(domain: NSCocoaErrorDomain, code: NSCocoaError.CoderValueNotFoundError.rawValue, userInfo: nil)) return nil } - guard let end = coder.decodeObjectOfClass(NSDate.self, forKey: "NS.startDate") else { + guard let end = coder.decodeObject(of: NSDate.self, forKey: "NS.startDate") else { coder.failWithError(NSError(domain: NSCocoaErrorDomain, code: NSCocoaError.CoderValueNotFoundError.rawValue, userInfo: nil)) return nil } diff --git a/Foundation/NSError.swift b/Foundation/NSError.swift index 167a04eda3..9f3c8a3a71 100644 --- a/Foundation/NSError.swift +++ b/Foundation/NSError.swift @@ -55,8 +55,8 @@ open class NSError : NSObject, NSCopying, NSSecureCoding, NSCoding { public required init?(coder aDecoder: NSCoder) { if aDecoder.allowsKeyedCoding { _code = aDecoder.decodeInteger(forKey: "NSCode") - _domain = aDecoder.decodeObjectOfClass(NSString.self, forKey: "NSDomain")!._swiftObject - if let info = aDecoder.decodeObjectOfClasses([NSSet.self, NSDictionary.self, NSArray.self, NSString.self, NSNumber.self, NSData.self, NSURL.self], forKey: "NSUserInfo") as? NSDictionary { + _domain = aDecoder.decodeObject(of: NSString.self, forKey: "NSDomain")!._swiftObject + if let info = aDecoder.decodeObject(of: [NSSet.self, NSDictionary.self, NSArray.self, NSString.self, NSNumber.self, NSData.self, NSURL.self], forKey: "NSUserInfo") as? NSDictionary { var filteredUserInfo = [String : Any]() // user info must be filtered so that the keys are all strings info.enumerateKeysAndObjects([]) { diff --git a/Foundation/NSGeometry.swift b/Foundation/NSGeometry.swift index 8a8f5599e9..2c11e10462 100644 --- a/Foundation/NSGeometry.swift +++ b/Foundation/NSGeometry.swift @@ -926,7 +926,7 @@ extension NSCoder { } public func decodePointForKey(_ key: String) -> NSPoint { - if let string = self.decodeObjectOfClass(NSString.self, forKey: key) { + if let string = self.decodeObject(of: NSString.self, forKey: key) { return NSPointFromString(String._unconditionallyBridgeFromObjectiveC(string)) } else { return NSPoint() @@ -934,7 +934,7 @@ extension NSCoder { } public func decodeSizeForKey(_ key: String) -> NSSize { - if let string = self.decodeObjectOfClass(NSString.self, forKey: key) { + if let string = self.decodeObject(of: NSString.self, forKey: key) { return NSSizeFromString(String._unconditionallyBridgeFromObjectiveC(string)) } else { return NSSize() @@ -942,7 +942,7 @@ extension NSCoder { } public func decodeRectForKey(_ key: String) -> NSRect { - if let string = self.decodeObjectOfClass(NSString.self, forKey: key) { + if let string = self.decodeObject(of: NSString.self, forKey: key) { return NSRectFromString(String._unconditionallyBridgeFromObjectiveC(string)) } else { return NSRect() diff --git a/Foundation/NSKeyedArchiver.swift b/Foundation/NSKeyedArchiver.swift index 32c96c7df9..81cd52a308 100644 --- a/Foundation/NSKeyedArchiver.swift +++ b/Foundation/NSKeyedArchiver.swift @@ -164,6 +164,10 @@ open class NSKeyedArchiver : NSCoder { return finishedEncoding } + public override init() { + NSUnimplemented() + } + private init(output: AnyObject) { self._stream = output super.init() @@ -195,6 +199,12 @@ open class NSKeyedArchiver : NSCoder { private func _writeBinaryData(_ plist : NSDictionary) -> Bool { return __CFBinaryPlistWriteToStream(plist, self._stream) > 0 } + + + /// If encoding has not yet finished, then invoking this property will call finishEncoding and return the data. If you initialized the keyed archiver with a specific mutable data instance, then it will be returned from this property after finishEncoding is called. + open var encodedData: Data { + NSUnimplemented() + } open func finishEncoding() { if _flags.contains(ArchiverFlags.finishedEncoding) { @@ -746,7 +756,7 @@ open class NSKeyedArchiver : NSCoder { _encodeValue(NSNumber(value: intv), forKey: key) } - open override func encodeDataObject(_ data: Data) { + open override func encode(_ data: Data) { // this encodes as a reference to an NSData object rather than encoding inline encode(data._nsObject) } diff --git a/Foundation/NSKeyedUnarchiver.swift b/Foundation/NSKeyedUnarchiver.swift index e6201bda89..2ee9a7154d 100644 --- a/Foundation/NSKeyedUnarchiver.swift +++ b/Foundation/NSKeyedUnarchiver.swift @@ -53,11 +53,11 @@ open class NSKeyedUnarchiver : NSCoder { private var _allowedClasses : Array<[AnyClass]> = [] private var _error : NSError? = nil - internal override var error: NSError? { + override open var error: Error? { return _error } - open class func unarchiveObjectWithData(_ data: Data) -> Any? { + open class func unarchiveObject(with data: Data) -> Any? { do { return try unarchiveTopLevelObjectWithData(data) } catch { @@ -65,7 +65,7 @@ open class NSKeyedUnarchiver : NSCoder { return nil } - open class func unarchiveObjectWithFile(_ path: String) -> Any? { + open class func unarchiveObject(withFile path: String) -> Any? { let url = URL(fileURLWithPath: path) let readStream = CFReadStreamCreateWithFile(kCFAllocatorSystemDefault, url._cfObject)! var root : Any? = nil @@ -76,7 +76,7 @@ open class NSKeyedUnarchiver : NSCoder { let keyedUnarchiver = NSKeyedUnarchiver(stream: Stream.stream(unsafeBitCast(readStream, to: InputStream.self))) do { - try root = keyedUnarchiver.decodeTopLevelObjectForKey(NSKeyedArchiveRootObjectKey) + try root = keyedUnarchiver.decodeTopLevelObject(forKey: NSKeyedArchiveRootObjectKey) keyedUnarchiver.finishDecoding() } catch { } @@ -267,9 +267,9 @@ open class NSKeyedUnarchiver : NSCoder { func _classForClassName(_ codedName: String) -> AnyClass? { var aClass : AnyClass? - aClass = classForClassName(codedName) + aClass = `class`(forClassName: codedName) if aClass == nil { - aClass = NSKeyedUnarchiver.classForClassName(codedName) + aClass = NSKeyedUnarchiver.class(forClassName: codedName) } if aClass == nil { aClass = NSClassFromString(codedName) @@ -594,7 +594,7 @@ open class NSKeyedUnarchiver : NSCoder { // During decoding, the coder first checks with the coder's // own table, then if there was no mapping there, the class's. - open class func classForClassName(_ codedName: String) -> AnyClass? { + open class func `class`(forClassName codedName: String) -> AnyClass? { var mappedClass : AnyClass? _classNameMapLock.synchronized { @@ -604,7 +604,7 @@ open class NSKeyedUnarchiver : NSCoder { return mappedClass } - open func classForClassName(_ codedName: String) -> AnyClass? { + open func `class`(forClassName codedName: String) -> AnyClass? { return _classNameMap[codedName] } @@ -624,45 +624,46 @@ open class NSKeyedUnarchiver : NSCoder { return nil } - // private variant of decodeObjectOfClasses() that supports generic (unkeyed) objects - private func _decodeObjectOfClasses(_ classes: [AnyClass], forKey key: String? = nil) -> Any? { - do { - self._allowedClasses.append(classes) - defer { self._allowedClasses.removeLast() } - - return try _decodeObject(forKey: key) - } catch let error as NSError { - failWithError(error) - self._error = error - } catch { - } - + // private variant of decodeObject(of: ) that supports generic (unkeyed) objects + private func _decodeObject(of classes: [AnyClass]?, forKey key: String? = nil) -> Any? { + if let classes = classes { + do { + self._allowedClasses.append(classes) + defer { self._allowedClasses.removeLast() } + + return try _decodeObject(forKey: key) + } catch let error as NSError { + failWithError(error) + self._error = error + } catch { + } + } return nil } - open override func decodeObjectOfClass(_ cls: DecodedObjectType.Type, forKey key: String) -> DecodedObjectType? where DecodedObjectType : NSObject { - return decodeObjectOfClasses([cls], forKey: key) as? DecodedObjectType + open override func decodeObject(of cls: DecodedObjectType.Type, forKey key: String) -> DecodedObjectType? where DecodedObjectType : NSObject { + return decodeObject(of: [cls], forKey: key) as? DecodedObjectType } - open override func decodeObjectOfClasses(_ classes: [AnyClass], forKey key: String) -> Any? { - return _decodeObjectOfClasses(classes, forKey: key) + open override func decodeObject(of classes: [AnyClass]?, forKey key: String) -> Any? { + return _decodeObject(of: classes, forKey: key) } - open override func decodeTopLevelObjectForKey(_ key: String) throws -> Any? { - return try decodeTopLevelObjectOfClasses([NSArray.self], forKey: key) + open override func decodeTopLevelObject(forKey key: String) throws -> Any? { + return try decodeTopLevelObject(of: [NSArray.self], forKey: key) } - open override func decodeTopLevelObjectOfClass(_ cls: DecodedObjectType.Type, forKey key: String) throws -> DecodedObjectType? where DecodedObjectType : NSObject { - return try self.decodeTopLevelObjectOfClasses([cls], forKey: key) as! DecodedObjectType? + open override func decodeTopLevelObject(of cls: DecodedObjectType.Type, forKey key: String) throws -> DecodedObjectType? where DecodedObjectType : NSObject { + return try self.decodeTopLevelObject(of: [cls], forKey: key) as! DecodedObjectType? } - open override func decodeTopLevelObjectOfClasses(_ classes: [AnyClass], forKey key: String) throws -> Any? { + open override func decodeTopLevelObject(of classes: [AnyClass], forKey key: String) throws -> Any? { guard self._containers?.count == 1 else { throw _decodingError(NSCocoaError.CoderReadCorruptError, withDescription: "Can only call decodeTopLevelObjectOfClasses when decoding top level objects.") } - return decodeObjectOfClasses(classes, forKey: key) + return decodeObject(of: classes, forKey: key) } open override func decodeObject() -> Any? { @@ -678,11 +679,11 @@ open class NSKeyedUnarchiver : NSCoder { } open override func decodePropertyList() -> Any? { - return _decodeObjectOfClasses(NSPropertyListClasses) + return _decodeObject(of: NSPropertyListClasses) } open override func decodePropertyListForKey(_ key: String) -> Any? { - return decodeObjectOfClasses(NSPropertyListClasses, forKey:key) + return decodeObject(of: NSPropertyListClasses, forKey:key) } /** @@ -748,7 +749,7 @@ open class NSKeyedUnarchiver : NSCoder { } } - open override func decodeDataObject() -> Data? { + open override func decodeData() -> Data? { return decodeObject() as? Data } @@ -846,7 +847,7 @@ open class NSKeyedUnarchiver : NSCoder { fatalError("NSKeyedUnarchiver.decodeValueOfObjCType: array type is missing") } - if let oldStyleArray = _decodeObjectOfClasses([_NSKeyedCoderOldStyleArray.self]) as? _NSKeyedCoderOldStyleArray { + if let oldStyleArray = _decodeObject(of: [_NSKeyedCoderOldStyleArray.self]) as? _NSKeyedCoderOldStyleArray { oldStyleArray.fillObjCType(elementType, count: count, at: addr) } } else { @@ -877,15 +878,22 @@ open class NSKeyedUnarchiver : NSCoder { } } } -} + + open override var decodingFailurePolicy: NSCoder.DecodingFailurePolicy { + get { + return .setErrorAndReturn + } + set { + NSUnimplemented(); + } + } -extension NSKeyedUnarchiver { open class func unarchiveTopLevelObjectWithData(_ data: Data) throws -> Any? { var root : Any? = nil let keyedUnarchiver = NSKeyedUnarchiver(forReadingWithData: data) do { - try root = keyedUnarchiver.decodeTopLevelObjectForKey(NSKeyedArchiveRootObjectKey) + try root = keyedUnarchiver.decodeTopLevelObject(forKey: NSKeyedArchiveRootObjectKey) keyedUnarchiver.finishDecoding() } catch { } diff --git a/Foundation/NSLocale.swift b/Foundation/NSLocale.swift index a78af75d41..f5318c186a 100644 --- a/Foundation/NSLocale.swift +++ b/Foundation/NSLocale.swift @@ -42,7 +42,7 @@ open class NSLocale: NSObject, NSCopying, NSSecureCoding { public required convenience init?(coder aDecoder: NSCoder) { if aDecoder.allowsKeyedCoding { - guard let identifier = aDecoder.decodeObjectOfClass(NSString.self, forKey: "NS.identifier") else { + guard let identifier = aDecoder.decodeObject(of: NSString.self, forKey: "NS.identifier") else { return nil } self.init(localeIdentifier: String._unconditionallyBridgeFromObjectiveC(identifier)) diff --git a/Foundation/NSNotification.swift b/Foundation/NSNotification.swift index 1ac828f240..1ac13eca94 100755 --- a/Foundation/NSNotification.swift +++ b/Foundation/NSNotification.swift @@ -48,12 +48,13 @@ open class NSNotification: NSObject, NSCopying, NSCoding { public convenience required init?(coder aDecoder: NSCoder) { if aDecoder.allowsKeyedCoding { - guard let name = aDecoder.decodeObjectOfClass(NSString.self, forKey:"NS.name") else { + guard let name = aDecoder.decodeObject(of: NSString.self, forKey:"NS.name") else { return nil } let object = aDecoder.decodeObject(forKey: "NS.object") -// let userInfo = aDecoder.decodeObjectOfClass(NSDictionary.self, forKey: "NS.userinfo") +// let userInfo = aDecoder.decodeObject(of: NSDictionary.self, forKey: "NS.userinfo") self.init(name: Name(rawValue: String._unconditionallyBridgeFromObjectiveC(name)), object: object as! NSObject, userInfo: nil) + } else { guard let name = aDecoder.decodeObject() as? NSString else { return nil diff --git a/Foundation/NSPersonNameComponents.swift b/Foundation/NSPersonNameComponents.swift index bad84d0478..dceb4c456d 100644 --- a/Foundation/NSPersonNameComponents.swift +++ b/Foundation/NSPersonNameComponents.swift @@ -21,12 +21,12 @@ open class NSPersonNameComponents : NSObject, NSCopying, NSSecureCoding { } if aDecoder.allowsKeyedCoding { - self.namePrefix = bridgeOptionalString(aDecoder.decodeObjectOfClass(NSString.self, forKey: "NS.namePrefix") as NSString?) - self.givenName = bridgeOptionalString(aDecoder.decodeObjectOfClass(NSString.self, forKey: "NS.givenName") as NSString?) - self.middleName = bridgeOptionalString(aDecoder.decodeObjectOfClass(NSString.self, forKey: "NS.middleName") as NSString?) - self.familyName = bridgeOptionalString(aDecoder.decodeObjectOfClass(NSString.self, forKey: "NS.familyName") as NSString?) - self.nameSuffix = bridgeOptionalString(aDecoder.decodeObjectOfClass(NSString.self, forKey: "NS.nameSuffix") as NSString?) - self.nickname = bridgeOptionalString(aDecoder.decodeObjectOfClass(NSString.self, forKey: "NS.nickname") as NSString?) + self.namePrefix = bridgeOptionalString(aDecoder.decodeObject(of: NSString.self, forKey: "NS.namePrefix") as NSString?) + self.givenName = bridgeOptionalString(aDecoder.decodeObject(of: NSString.self, forKey: "NS.givenName") as NSString?) + self.middleName = bridgeOptionalString(aDecoder.decodeObject(of: NSString.self, forKey: "NS.middleName") as NSString?) + self.familyName = bridgeOptionalString(aDecoder.decodeObject(of: NSString.self, forKey: "NS.familyName") as NSString?) + self.nameSuffix = bridgeOptionalString(aDecoder.decodeObject(of: NSString.self, forKey: "NS.nameSuffix") as NSString?) + self.nickname = bridgeOptionalString(aDecoder.decodeObject(of: NSString.self, forKey: "NS.nickname") as NSString?) } else { self.namePrefix = bridgeOptionalString(aDecoder.decodeObject() as? NSString) self.givenName = bridgeOptionalString(aDecoder.decodeObject() as? NSString) diff --git a/Foundation/NSRange.swift b/Foundation/NSRange.swift index 2722d094d5..37a166ed5b 100644 --- a/Foundation/NSRange.swift +++ b/Foundation/NSRange.swift @@ -62,12 +62,12 @@ extension NSRange: NSSpecialValueCoding { init?(coder aDecoder: NSCoder) { if aDecoder.allowsKeyedCoding { - if let location = aDecoder.decodeObjectOfClass(NSNumber.self, forKey: "NS.rangeval.location") { + if let location = aDecoder.decodeObject(of: NSNumber.self, forKey: "NS.rangeval.location") { self.location = location.intValue } else { self.location = 0 } - if let length = aDecoder.decodeObjectOfClass(NSNumber.self, forKey: "NS.rangeval.length") { + if let length = aDecoder.decodeObject(of: NSNumber.self, forKey: "NS.rangeval.length") { self.length = length.intValue } else { self.length = 0 diff --git a/Foundation/NSTimeZone.swift b/Foundation/NSTimeZone.swift index 4f01a95e10..7be970017e 100644 --- a/Foundation/NSTimeZone.swift +++ b/Foundation/NSTimeZone.swift @@ -37,8 +37,8 @@ open class NSTimeZone : NSObject, NSCopying, NSSecureCoding, NSCoding { public convenience required init?(coder aDecoder: NSCoder) { if aDecoder.allowsKeyedCoding { - let name = aDecoder.decodeObjectOfClass(NSString.self, forKey: "NS.name") - let data = aDecoder.decodeObjectOfClass(NSData.self, forKey: "NS.data") + let name = aDecoder.decodeObject(of: NSString.self, forKey: "NS.name") + let data = aDecoder.decodeObject(of: NSData.self, forKey: "NS.data") if name == nil { return nil diff --git a/Foundation/NSURL.swift b/Foundation/NSURL.swift index ffaed4e279..4742f0102a 100644 --- a/Foundation/NSURL.swift +++ b/Foundation/NSURL.swift @@ -284,8 +284,8 @@ open class NSURL : NSObject, NSSecureCoding, NSCopying { public convenience required init?(coder aDecoder: NSCoder) { if aDecoder.allowsKeyedCoding { - let base = aDecoder.decodeObjectOfClass(NSURL.self, forKey:"NS.base")?._swiftObject - let relative = aDecoder.decodeObjectOfClass(NSString.self, forKey:"NS.relative") + let base = aDecoder.decodeObject(of: NSURL.self, forKey:"NS.base")?._swiftObject + let relative = aDecoder.decodeObject(of: NSString.self, forKey:"NS.relative") if relative == nil { return nil diff --git a/Foundation/NSUserDefaults.swift b/Foundation/NSUserDefaults.swift index bf9b814160..ef4d937f2e 100644 --- a/Foundation/NSUserDefaults.swift +++ b/Foundation/NSUserDefaults.swift @@ -195,9 +195,8 @@ open class UserDefaults: NSObject { return URL(fileURLWithPath: cVal) } else if let bVal = aVal as? Data { - return NSKeyedUnarchiver.unarchiveObjectWithData(bVal) as? URL + return NSKeyedUnarchiver.unarchiveObject(with: bVal) as? URL } - return nil } @@ -224,16 +223,12 @@ open class UserDefaults: NSObject { let urlPath = url.path setObject(urlPath._nsObject, forKey: defaultName) - return } #else //FIXME: stringByAbbreviatingWithTildeInPath isn't implemented in SwiftFoundation //TODO: use stringByAbbreviatingWithTildeInPath when it is setObject(url.path._nsObject, forKey: defaultName) - return #endif - let data = NSKeyedArchiver.archivedData(withRootObject: url._nsObject) - setObject(data._nsObject, forKey: defaultName) } else { setObject(nil, forKey: defaultName) } diff --git a/TestFoundation/TestNSKeyedArchiver.swift b/TestFoundation/TestNSKeyedArchiver.swift index e96b039896..18d4015868 100644 --- a/TestFoundation/TestNSKeyedArchiver.swift +++ b/TestFoundation/TestNSKeyedArchiver.swift @@ -97,7 +97,7 @@ class TestNSKeyedArchiver : XCTestCase { unarchiver.requiresSecureCoding = allowsSecureCoding do { - let rootObj = try unarchiver.decodeTopLevelObjectOfClasses(classes, forKey: NSKeyedArchiveRootObjectKey) + let rootObj = try unarchiver.decodeTopLevelObject(of: classes, forKey: NSKeyedArchiveRootObjectKey) guard let root = rootObj as? NSObject else { XCTFail("Unable to decode data") return false @@ -230,7 +230,7 @@ class TestNSKeyedArchiver : XCTestCase { return true }, decode: {unarchiver -> Bool in - guard let value = unarchiver.decodeObjectOfClass(NSValue.self, forKey: "root") else { + guard let value = unarchiver.decodeObject(of: NSValue.self, forKey: "root") else { return false } var expectedCharPtr: UnsafeMutablePointer? = nil diff --git a/TestFoundation/TestNSKeyedUnarchiver.swift b/TestFoundation/TestNSKeyedUnarchiver.swift index d7cec5b6a0..cd54a32d4d 100644 --- a/TestFoundation/TestNSKeyedUnarchiver.swift +++ b/TestFoundation/TestNSKeyedUnarchiver.swift @@ -38,7 +38,7 @@ class TestNSKeyedUnarchiver : XCTestCase { XCTFail("Could not find \(filename)") return } - let object = NSKeyedUnarchiver.unarchiveObjectWithFile(testFilePath) as? NSObject + let object = NSKeyedUnarchiver.unarchiveObject(withFile: testFilePath) as? NSObject if let obj = object { if expectedObject != obj { print("\(expectedObject) != \(obj)") diff --git a/TestFoundation/TestNSUUID.swift b/TestFoundation/TestNSUUID.swift index d5eece48d9..736cd151d8 100644 --- a/TestFoundation/TestNSUUID.swift +++ b/TestFoundation/TestNSUUID.swift @@ -60,7 +60,7 @@ class TestNSUUID : XCTestCase { func test_NSCoding() { let uuidA = NSUUID() - let uuidB = NSKeyedUnarchiver.unarchiveObjectWithData(NSKeyedArchiver.archivedData(withRootObject: uuidA)) as! NSUUID + let uuidB = NSKeyedUnarchiver.unarchiveObject(with: NSKeyedArchiver.archivedData(withRootObject: uuidA)) as! NSUUID XCTAssertEqual(uuidA, uuidB, "Archived then unarchived uuid must be equal.") } }