2016-06-28 12 views
6

Ich verwende Xcode8 Beta mit Swift 3.0. Ich habe versucht, eine einfache Objektbasis auf NSObject zu kodieren, aber ich kann Int oder NSInteger nicht decodieren. (Der Codierungsprozess ist OK)Fehler beim Decodieren von Int mit NSCoder in Swift

enter image description here

Codes

class Model : NSObject, NSCoding { 
    var seq: NSNumber? 
    var seq2: Int? // problem with seq2, NSInteger is not ok, either 
    var id: String? 
    var value: String? 

    override init() { 
     super.init() 
    } 

    required init?(coder aDecoder: NSCoder){ 
     self.seq = aDecoder.decodeObject(forKey: "seq") as? NSNumber 
     self.seq2 = aDecoder.decodeInteger(forKey: "seq2") 
     self.id = aDecoder.decodeObject(forKey: "id") as? String 
     self.value = aDecoder.decodeObject(forKey: "value") as? String 
    } 

    func encode(with aCoder: NSCoder){ 
     aCoder.encode(seq, forKey: "seq") 
     aCoder.encode(seq2, forKey: "seq2") 
     aCoder.encode(id, forKey: "id") 
     aCoder.encode(value, forKey: "value") 
    } 
} 

Antwort

6

Das Problem ist, dass seq2 ist keine Int, sondern ein Int? optional. Es kann nicht als Objective-C-Integer dargestellt werden.

können Sie decodeObject verwenden:

required init?(coder aDecoder: NSCoder){ 
    self.seq = aDecoder.decodeObject(forKey: "seq") as? NSNumber 
    self.seq2 = aDecoder.decodeObject(forKey: "seq2") as? Int 
    self.id = aDecoder.decodeObject(forKey: "id") as? String 
    self.value = aDecoder.decodeObject(forKey: "value") as? String 

    super.init() 
} 

oder ändern, damit es nicht optional ist:

class Model : NSObject, NSCoding { 
    var seq: NSNumber? 
    var seq2: Int 
    var id: String? 
    var value: String? 

    init(seq: NSNumber, seq2: Int, id: String, value: String) { 
     self.seq = seq 
     self.seq2 = seq2 
     self.id = id 
     self.value = value 

     super.init() 
    } 

    required init?(coder aDecoder: NSCoder) { 
     self.seq = aDecoder.decodeObject(forKey: "seq") as? NSNumber 
     self.seq2 = aDecoder.decodeInteger(forKey: "seq2") 
     self.id = aDecoder.decodeObject(forKey: "id") as? String 
     self.value = aDecoder.decodeObject(forKey: "value") as? String 

     super.init() 
    } 

    func encode(with aCoder: NSCoder) { 
     aCoder.encode(seq, forKey: "seq") 
     aCoder.encode(seq2, forKey: "seq2") 
     aCoder.encode(id, forKey: "id") 
     aCoder.encode(value, forKey: "value") 
    } 

    override var description: String { return "<Model; seq=\(seq); seq2=\(seq2); id=\(id); value=\(value)>" } 
} 
+1

Was ist der sichere Weg, um Werte in Swift 3 zu dekodieren? Zum Beispiel, um sich gegen das Szenario zu schützen, in dem Sie 'decodeInteger' und' seq2' verwenden, ist keine Ganzzahl. Dies wurde in Swift 2 behandelt, indem eine 'let'-Anweisung für' decodeObject' verwendet wurde, aber 'decodeInteger' gibt keine optionale zurück. – Crashalot

0

Achten Sie darauf, mit Null-Werte

func encode(with aCoder: NSCoder){ 
    aCoder.encode(seq, forKey: "seq") 

    if let second_seq = self.seq2 
    { 
     aCoder.encode(second_seq, forKey: "seq2") 
    } 
    aCoder.encode(id, forKey: "id") 
    aCoder.encode(value, forKey: "value") 
} 

seq2 wird nil, wenn der Schlüssel auf Dekodierungsoperationen nicht vorhanden ist

1

Verwenden Sie th e encodeInteger Methode ganze Zahlen zu kodieren statt:

func encode(with aCoder: NSCoder) { 
    ... 
    aCoder.encodeInteger(seq2, forKey: "seq2") 
} 
+0

Was ist der sichere Weg 3 Werte in Swift zu entschlüsseln? Zum Beispiel, um sich gegen das Szenario zu schützen, in dem Sie 'decodeInteger' und' seq2' verwenden, ist keine Ganzzahl. Dies wurde in Swift 2 behandelt, indem eine 'let'-Anweisung für' decodeObject' verwendet wurde, aber 'decodeInteger' gibt keine optionale zurück. – Crashalot

Verwandte Themen