I am trying to declare two properties as optionals in a custom class - a String and an Int.
I'm doing this in MyClass:
var myString: String?
var myInt: Int?
I can decode them ok as follows:
required init?(coder aDecoder: NSCoder) {
myString = aDecoder.decodeObjectForKey("MyString") as? String
myInt = aDecoder.decodeIntegerForKey("MyInt")
}
But encoding them gives an error on the Int line:
func encodeWithCoder(aCoder: NSCoder) {
aCoder.encodeInteger(myInt, forKey: "MyInt")
aCoder.encodeObject(myString, forKey: "MyString")
}
The error only disappears when XCode prompts me to unwrap the Int as follows:
aCoder.encodeInteger(myInt!, forKey: "MyInt")
But that obviously results in a crash. So my question is, how can I get the Int to be treated as an optional like the String is? What am I missing?
If it can be optional, you will have to use encodeObject
for it, too.
You are using an Objective-C framework and Objective-C allows nil
only for objects (class/reference types). An integer cannot be nil
in Objective-C.
However, if you use encodeObject
, Swift will automatically convert your Int
to NSNumber
, which can be nil
.
Another option is to skip the value entirely:
if let myIntValue = myInt {
aCoder.encodeInteger(myIntValue, forKey: "MyInt")
}
and use containsValueForKey(_:)
when decoding.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With