我试图在自定义类中声明两个属性作为选项 - String和Int。
我在MyClass中这样做:
var myString: String?
var myInt: Int?
我可以按如下方式解码它们:
required init?(coder aDecoder: NSCoder) {
myString = aDecoder.decodeObjectForKey("MyString") as? String
myInt = aDecoder.decodeIntegerForKey("MyInt")
}
但是对它们进行编码会在Int线上产生错误:
func encodeWithCoder(aCoder: NSCoder) {
aCoder.encodeInteger(myInt, forKey: "MyInt")
aCoder.encodeObject(myString, forKey: "MyString")
}
当XCode提示我解开Int时,错误只会消失,如下所示:
aCoder.encodeInteger(myInt!, forKey: "MyInt")
但这显然会导致崩溃。所以我的问题是,如何将Int作为一个可选项来对待,就像String一样?我错过了什么?
答案 0 :(得分:25)
如果它可以是可选的,您也必须使用encodeObject
。
您正在使用Objective-C框架,而Objective-C仅允许nil
对象(类/引用类型)。 Objective-C中的整数不能为nil
。
但是,如果您使用encodeObject
,Swift会自动将您的Int
转换为NSNumber
,nil
。
另一个选择是完全跳过该值:
if let myIntValue = myInt {
aCoder.encodeInteger(myIntValue, forKey: "MyInt")
}
并在解码时使用containsValueForKey(_:)
。