2016-09-23 15 views
5

Swift 3 önce, böyle NSCoder ile boolean değerlerini deşifre:Swift 3: Değerleri NSCoder ile çözmenin güvenli yolu?

aDecoder.decodeBool(forKey: TestKey) 

Ama decodeBool için sınıf referans yapmaz:

if let value = aDecoder.decodeObjectForKey(TestKey) as? Bool { 
    test = value 
} 

Swift 3'te önerilen yaklaşım yerine bu kullanmaktır Kod çözdüğünüz değer aslında bir boole değilse, durumu nasıl ele alacağınızı açıklayın. Dönüş değeri isteğe bağlı olmadığından, decodeBool bir let ifadesine katışamazsınız.

Swift 3'teki değerleri nasıl güvenli bir şekilde çözersiniz?

+0

aDecoder.decodeBool sağlanan boolean değil, bu hata tutarsa, bu üzerinde Boole bekliyor olarak ly. Yani Bool olduğundan emin olmalısın, değil mi? – pedrouan

+0

doğru, bu yüzden @pedrouan kontrol etmek için güvenli bir yol değil. hata, hızlı 2 sözdizimi ile yakalanırdı. – Crashalot

+0

Hangi tür kodlama yaptığınızı bilmek zorundasınız. Bazı durumlarda bu biraz zor çünkü özellikle 'Bool' Bool 'olarak kodlanırken Bool '' Object' olarak kodlanır. Http://stackoverflow.com/questions/38072295/fail-to-decode-int-with-nscoder-in-swift adresine bakın. – Sulthan

cevap

4

Beni anlamaya uzun zaman aldı ama yine de böyle değerleri çözebilirsiniz. Eğer coder.encode(boolenValue, forKey: "myBool") ile bir boolean kodlamak zaman bunu böyle kodlamak zaman

// swift2: 
coder.encodeObject(Any?, forKey:String) 
coder.encodeBool(Bool, forKey:String) 

// swift3: 
coder.encode(Any?, forKey: String) 
coder.encode(Bool, forKey: String) 

Yani decodeBool ile deşifre var ama: Ben swift3 ile olan sorun kodlama yöntemlerine değiştirilmesidir

let booleanValue = true 
coder.encode(booleanValue as Any, forKey: "myBool") 

yine şöyle deşifre edebilir:

if let value = coder.decodeObject(forKey: "myBool") as? Bool { 
    test = value 
} 
+0

Hmmm bu iyi görünüyor, deneyeceğim. Bunu üretim uygulamalarında kullandınız mı? – Crashalot

+0

Evet, swift2 kodumu bu şekilde dönüştürdüm ve :-) bildiğim hiçbir sorun yok – errnesto

3

Önerilen decodeBool'u kullanmak istendiğinde bu güvenlidir (nil-coalescing op. Kullanarak daha kısa kod için).

let value = aDecoder.decodeObject(forKey: TestKey) as? Bool ?? aDecoder.decodeBool(forKey: TestKey) 

DecodeBool kullanmak Bool, IMO olduğundan emin olduğunda kullanılabilir.

+0

'TestKey' anahtardır (ve değer değil) ve her zaman tiptedir * Dize *. Büyük olasılıkla, hatta bir dizge sabiti. Böylece kod çözme asla yürütülmeyecek. Yanlış şeyi test ediyorsun. – Codo

+0

@Codo detaylandırır mısınız lütfen? TestKey bir dizge sabiti. Ayrıca Swift 3'teki değerleri deşifre etmenin güvenli yolunu biliyor musunuz? – Crashalot

+1

Yorumum, geçerli olandan tamamen farklı olan yanıtın orijinal sürümüne atıfta bulundu. – Codo