如何使用NSCoding

时间:2016-03-22 12:37:13

标签: xcode swift optional

我试图在自定义类中声明两个属性作为选项 - 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一样?我错过了什么?

1 个答案:

答案 0 :(得分:25)

如果它可以是可选的,您也必须使用encodeObject

您正在使用Objective-C框架,而Objective-C仅允许nil对象(类/引用类型)。 Objective-C中的整数不能为nil

但是,如果您使用encodeObject,Swift会自动将您的Int转换为NSNumbernil

另一个选择是完全跳过该值:

if let myIntValue = myInt {
    aCoder.encodeInteger(myIntValue, forKey: "MyInt")
}

并在解码时使用containsValueForKey(_:)