2016-03-22 13 views
10

Próbuję zadeklarować dwie właściwości jako opcje w niestandardowej klasie - String i Int.Jak kodować Int jako opcjonalny przy użyciu NSCoding

Robię to w MojaKlasa:

var myString: String? 
var myInt: Int? 

mogę rozszyfrować ich ok następująco:

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

Ale im kodowania daje błąd na linii Int:

func encodeWithCoder(aCoder: NSCoder) { 
    aCoder.encodeInteger(myInt, forKey: "MyInt") 
    aCoder.encodeObject(myString, forKey: "MyString") 
} 

Błąd zniknie tylko wtedy, gdy XCode poprosi mnie o rozwinięcie Int w następujący sposób:

aCoder.encodeInteger(myInt!, forKey: "MyInt") 

Ale to oczywiście powoduje awarię. Moje pytanie brzmi: jak mogę traktować Int jako traktowane jako opcjonalne, takie jak String? czego mi brakuje?

Odpowiedz

21

Jeśli może być opcjonalny, będziesz musiał użyć do niego także encodeObject.

Używasz architektury Objective-C, a Objective-C pozwala na nil tylko dla obiektów (klasy/typy referencyjne). Liczba całkowita nie może być nil w Objective-C.

Jeśli jednak używasz encodeObject, Swift automatycznie przekonwertuje Twój Int na NSNumber, który może być nil.

Inną opcją jest całkowicie pominąć wartość:

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

i używać containsValueForKey(_:) przy dekodowaniu.

+5

Dziękuję za odpowiedź i wyjaśnienie Sulthan. Używam teraz myInt = aDecoder.decodeObjectForKey ("MyInt") jako? Int i aCoder.encodeObject (myInt, forKey: "MyInt") i działa dobrze. – Eatton

Powiązane problemy