Как кодировать 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(_:) при декодировании.