2016-08-20 4 views
2

Ich habe diese einfache KlasseNSCoder Absturz auf decodeBool forKey (Xcode 8, Swift 3)

import UIKit 

class SimpleModel: NSObject, NSCoding { 

    var name : String! 
    var done : Bool! 

    init(name:String) { 
     self.name = name 
     self.done = false 
    } 

    internal required init?(coder aDecoder: NSCoder) { 
     self.name = aDecoder.decodeObject(forKey: "name") as! String 
     self.done = aDecoder.decodeBool(forKey: "done") // BUG HERE 
    } 

    func encode(with encoder: NSCoder) { 
     encoder.encode(self.name, forKey: "name") 
     encoder.encode(self.done, forKey: "done") 
    } 
} 

der Code speichern:

let data = NSKeyedArchiver.archivedData(withRootObject: storageArray) 
UserDefaults.standard.set(data, forKey: "storage") 
UserDefaults.standard.synchronize() 

der gelesene Code:

if let data = UserDefaults.standard.data(forKey: "storage") { 
    storageArray = NSKeyedUnarchiver.unarchiveObject(with: data) as! [SimpleModel] 
} 

die Problem tritt auf, wenn der NSKeyedUnarchiver seine Aufgabe erledigt. Ich kann nicht verstehen, wo das Problem herkommt.

Danke!

Antwort

7

der Trick entfernen ist! Bilden Sie die primitiven Typen. Wenn Sie setzen! Sie sagen "make implicit-unwrapped optional", so dass der Encoder als NSNumber anstelle von Bool (oder Int, Double) archiviert wird. Wenn Sie entfernen! der Encoder Archivierung wird als Bool und Dinge wie erwartet funktioniert (ich verbrachte einen „Vorfall“ und diese Lösung von Apple zur Verfügung gestellt wird)

+0

Ich konnte nicht oben verstehen, ich habe die Lösung aus dieser Antwort: https://Stackoverflow.com/a/39656687/1298362 – g212gs

+0

danke für eine aufschlussreiche Antwort, nicht nur "hier machen es funktioniert, indem Sie das tun ...." – TheFuquan

4

Ich hatte das gleiche Problem. Try this:

self.done = aDecoder.decodeObject(forKey: "done") as? Bool ?? aDecoder.decodeBool(forKey: "done") 
9

Bool und Int neue Methoden haben:

self.x = Int(decoder.decodeCInt(forKey: "Speed")) 
self.y = decoder.decodeObject(forKey: "Serial") as! String 
self.z = Bool(decoder.decodeBool(forKey: "Direction")) 
Verwandte Themen