Как кодировать Int как необязательный, используя NSCoding
Я пытаюсь объявить два свойства как необязательные в пользовательском классе - 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
Если это может быть необязательно, вам также придется использовать encodeObject
.
Используется инфраструктура Objective-C и Objective-C позволяет nil
только для объектов (типы классов/ссылок). Целое число не может быть nil
в Objective-C.
Однако, если вы используете encodeObject
, Swift автоматически преобразует ваш Int
в NSNumber
, который может быть nil
.
Другой вариант - полностью пропустить значение:
if let myIntValue = myInt {
aCoder.encodeInteger(myIntValue, forKey: "MyInt")
}
и используйте containsValueForKey(_:)
при декодировании.