一个类都可以坚持NSCoding并在Swift中拥有便利的初始化器吗?

时间:2015-02-11 09:13:20

标签: swift nscoding

class GeofencingPackage: NSObject, NSCoding {

let latitude : CLLocationDegrees
let longitude : CLLocationDegrees
let packageNumber : String    

func encodeWithCoder(aCoder: NSCoder) {
    aCoder.encodeDouble(latitude, forKey: Keys.latitude)
    aCoder.encodeDouble(longitude, forKey: Keys.longitude)
    aCoder.encodeObject(packageNumber, forKey: Keys.packageNumber)
}

required init(coder aDecoder: NSCoder) {
    super.init()
    latitude = aDecoder.decodeDoubleForKey(Keys.latitude)
    longitude = aDecoder.decodeDoubleForKey(Keys.longitude)
    packageNumber = aDecoder.decodeObjectForKey(Keys.packageNumber) as String
}

convenience init(attributes: Dictionary<String,AnyObject>) {
    self.init()
    latitude = attributes[Keys.latitude] as? Double
    longitude = attributes[Keys.longitude] as? Double
    packageNumber = attributes[Keys.packageNumber] as? String
}

convenience init方法中,我在Missing argument for parameter 'Coder' in call上收到错误self.init()

我想要做的是让类遵循nscoding,但是当我从后端解析它时,我也想让它用json属性初始化。有没有办法做到这一点?

1 个答案:

答案 0 :(得分:1)

GeofencingPackage类定义指定的(=非便利)启动器

required init(coder aDecoder: NSCoder) { ... }

因此继承其所有超类指定的初始值设定项。特别是,它不会继承init() 来自NSObject的方法,所以你 必须添加它:

override init() {
    // initialize all properties
    super.init()
}

或者,定义指定的初始化程序而不是方便 初始化:

init(attributes: Dictionary<String,AnyObject>) {
    latitude = ...
    longitude = ...
    packageNumber = ...
    super.init()
}