2016-03-22 6 views
10

Sto tentando di dichiarare due proprietà come opzionali in una classe personalizzata: una stringa e un Int.Come codificare Int come facoltativo utilizzando NSCoding

sto facendo questo in MyClass:

var myString: String? 
var myInt: Int? 

loro posso decodificare ok come segue:

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

Ma codifica li dà un errore sulla linea Int:

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

L'errore scompare solo quando XCode mi suggerisce di scartare Int come segue:

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

Ma questo ovviamente si traduce in un incidente. Quindi la mia domanda è, come posso ottenere che l'Int sia trattato come un optional come lo String? Cosa mi manca?

risposta

21

Se può essere facoltativo, sarà necessario utilizzare anche encodeObject.

Si sta utilizzando un framework Objective-C e Objective-C consente nil solo per gli oggetti (classe/tipi di riferimento). Un numero intero non può essere nil in Objective-C.

Tuttavia, se si utilizza encodeObject, Swift convertirà automaticamente il Int-NSNumber, che può essere nil.

Un'altra opzione è quella di saltare il valore del tutto:

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

Utilizzando containsValueForKey(_:) quando decodifica.

+5

Grazie per la risposta e spiegazione Sulthan. Ora sto usando myInt = aDecoder.decodeObjectForKey ("MyInt") come? Int e aCoder.encodeObject (myInt, forKey: "MyInt") e funziona correttamente. – Eatton