2016-09-23 1 views
5

Vor Swift 3, entschlüsseln Sie Boolesche Werte mit NSCoder wie folgt aus:Swift 3: Sicherer Weg, um Werte mit NSCoder zu dekodieren?

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

Der vorgeschlagene Ansatz in Swift 3 ist dies stattdessen zu verwenden:

aDecoder.decodeBool(forKey: TestKey) 

Aber die Klassenreferenz für decodeBool nicht der Fall ist Erklären Sie, wie Sie mit der Situation umgehen, wenn der Wert, den Sie dekodieren, nicht wirklich ein boolescher Wert ist. Sie können decodeBool nicht in eine let-Anweisung einbetten, da der Rückgabewert kein optionaler Wert ist.

Wie dekodieren Sie Werte in Swift 3 sicher?

+0

Wenn nicht aDecoder.decodeBool bereitgestellt boolean, den Fehler auslöst, wie es Boolean erwartet auf ly. Du musst also sicher sein, dass es Bool ist, oder? – pedrouan

+0

richtig, es ist also kein sicherer Weg, @pedrouan zu überprüfen. Der Fehler würde mit der Swift 2-Syntax gefangen werden. – Crashalot

+0

Sie müssen wissen, welchen Typ Sie codieren. Dies ist in einigen Fällen etwas schwierig, insbesondere weil "Bool" als "Bool" kodiert ist, während "Bool?" Als "Object" kodiert ist. Siehe http://stackoverflow.com/questions/38072295/fail-to-decode-int-with-nscoder-in-swift. – Sulthan

Antwort

4

Ich brauchte eine lange Zeit, um herauszufinden, aber Sie können Werte wie diese immer noch dekodieren. Das Problem, das ich mit swift3 hatte, ist die Umbenennung der Codierverfahren:

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

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

Also, wenn Sie einen boolean mit coder.encode(boolenValue, forKey: "myBool") kodieren müssen Sie es mit decodeBool dekodieren, aber wenn man es wie folgt kodieren:

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

Sie können immer noch es so dekodieren:

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

Hmmm das sieht gut aus, werde es ausprobieren. Hast du das in Produktions-Apps genutzt? – Crashalot

+0

Nun ja, ich habe meinen swift2-Code so konvertiert und es gibt keine Probleme, die ich kenne :-) – errnesto

3

Dies ist sicher (für kürzere Code mit Null-Coalescing-Op.), Wenn Sie vorgeschlagene decodeBool verwenden möchten.

Verwenden decodeBool ist in Situationen möglich, in denen sicher ist, dass es Bool, IMO ist.

+0

'TestKey' ist der Schlüssel (und nicht der Wert) und hat immer den Typ * String *. Wahrscheinlich ist es sogar eine String-Konstante. Daher wird die Decodierung niemals ausgeführt. Sie testen die falsche Sache. – Codo

+0

@ Codo können Sie bitte erarbeiten? TestKey ist eine String-Konstante. Kennst du auch den sicheren Weg, Werte in Swift 3 zu dekodieren? – Crashalot

+1

Mein Kommentar bezog sich auf die ursprüngliche Version der Antwort, die sich vollständig von der aktuellen unterschied. – Codo

Verwandte Themen