2016-03-22 9 views
10

Ich versuche, zwei Eigenschaften als Optionals in einer benutzerdefinierten Klasse zu deklarieren - ein String und ein Int.So verschlüsseln Sie Int als eine Option mit NSCoding

Ich tue dies in MyClass:

var myString: String? 
var myInt: Int? 

ich sie ok dekodieren kann wie folgt dar:

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

Aber diese kodieren gibt einen Fehler auf der Linie Int:

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

Der Fehler verschwindet nur, wenn XCode mich dazu auffordert, Int wie folgt auszupacken:

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

Aber das führt offensichtlich zu einem Absturz. Meine Frage ist also, wie kann ich den Int so behandeln wie ein optionaler String? Was vermisse ich?

Antwort

21

Wenn es optional sein kann, müssen Sie auch encodeObject dafür verwenden.

Sie verwenden ein Objective-C-Framework und Objective-C ermöglicht nil nur für Objekte (Klasse/Referenztypen). Eine Ganzzahl kann in Objective-C nicht nil sein.

Wenn Sie jedoch verwenden encodeObject, wird Swift automatisch konvertieren Sie Ihre Int-NSNumber, die nil sein kann.

Eine weitere Option ist der Wert ganz überspringen:

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

und containsValueForKey(_:) verwenden bei der Decodierung.

+5

Vielen Dank für die Antwort und Erklärung Sulthan. Ich verwende jetzt myInt = aDecoder.decodeObjectForKey ("MyInt") als? Int und aCoder.encodeObject (myInt, forKey: "MyInt") und es funktioniert gut. – Eatton

Verwandte Themen