如何使用NSCoding将Int编码为可选

Eat*_*ton 13 xcode optional swift

我试图在自定义类中声明两个属性作为选项 - String和Int.

我在MyClass中这样做:

var myString: String?
var myInt: Int?
Run Code Online (Sandbox Code Playgroud)

我可以解释它们如下:

required init?(coder aDecoder: NSCoder) {
  myString = aDecoder.decodeObjectForKey("MyString") as? String
  myInt = aDecoder.decodeIntegerForKey("MyInt")
}
Run Code Online (Sandbox Code Playgroud)

但是对它们进行编码会在Int行上产生错误:

func encodeWithCoder(aCoder: NSCoder) {
  aCoder.encodeInteger(myInt, forKey: "MyInt")
  aCoder.encodeObject(myString, forKey: "MyString")
}
Run Code Online (Sandbox Code Playgroud)

当XCode提示我打开Int时,错误只会消失,如下所示:

  aCoder.encodeInteger(myInt!, forKey: "MyInt")
Run Code Online (Sandbox Code Playgroud)

但这显然会导致崩溃.所以我的问题是,如何将Int作为一个可选项来对待,就像String一样?我错过了什么?

Sul*_*han 25

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

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

但是,如果您使用encodeObject,Swift会自动将您转换IntNSNumber,即可nil.

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

if let myIntValue = myInt {
    aCoder.encodeInteger(myIntValue, forKey: "MyInt")
}
Run Code Online (Sandbox Code Playgroud)

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

  • 谢谢你答复和解释Sulthan.我现在使用myInt = aDecoder.decodeObjectForKey("MyInt")作为?Int和aCoder.encodeObject(myInt,forKey:"MyInt"),它工作正常. (6认同)