2016-03-22 14 views
10

Özel bir sınıfta isteğe bağlı olarak iki özellik bildirmeye çalışıyorum - String ve Int.NSCoding kullanarak isteğe bağlı olarak Int kodlama nasıl yapılır

MyClass içinde yapıyorum:

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

Ama onları kodlayan Int hattında bir hata veriyor:

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

var myString: String? 
var myInt: Int? 

tamam bunları deşifre edebilir

Hata yalnızca XCode Int'i aşağıdaki gibi açmak istememi istediğinde kaybolur:

Ancak bu açıkça bir kilitlenme ile sonuçlanır. Yani benim sorum, Int'in String gibi isteğe bağlı bir seçenek olarak nasıl ele alınabilir? Neyi kaçırıyorum?

cevap

21

İsteğe bağlı olabilir, bunun için de encodeObject kullanmanız gerekecek.

Bir Objective-C çerçevesi kullanıyorsunuz ve Objective-C, nil sadece nesneler (sınıf/referans türleri) için izin veriyor. Bir tam sayı Objective-C'de nil olamaz. Eğer encodeObject kullanırsanız

Ancak, Swift otomatik dönüştürür sizin Intnil olabilir NSNumber için.

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

ve çözüldüğü zaman containsValueForKey(_:) kullanın:

Diğer bir seçenek tamamen değerini atlamak etmektir.

+5

Yanıt ve açıklama Sulthan için teşekkür ederiz. Şimdi myInt = aDecoder.decodeObjectForKey ("MyInt") kullanıyorum? Int ve aCoder.encodeObject (myInt, forKey: "MyInt") ve iyi çalışıyor. – Eatton

İlgili konular