2016-06-28 18 views
6

Sto utilizzando Xcode8 Beta con Swift 3.0. Ho provato a codificare un semplice oggetto base su NSObject, ma non riesco a decodificare il tipo Int o NSInteger. (Il processo di codifica è OK)Impossibile decodificare Int con NSCoder in Swift

enter image description here

codici

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") 
    } 
} 

risposta

6

Il problema è che non è un seq2Int, ma piuttosto un Int? opzionale. Non può essere rappresentato come un numero intero Objective-C.

È possibile utilizzare decodeObject:

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() 
} 

o modificarlo in modo che non è un optional:

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

Qual è il modo sicuro per decodificare i valori in Swift 3? Ad esempio, per proteggerci dallo scenario in cui usi 'decodeInteger' e' seq2' non è un intero. Questo è stato gestito in Swift 2 usando un'istruzione 'let' per' decodeObject', ma 'decodeInteger' non restituisce un optional. – Crashalot

0

Prendere attenzione con valori nulli

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 sarà nil se la chiave non è presente sulle operazioni di decodifica

1

Utilizzare th Metodo E encodeInteger per codificare interi invece:

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

Qual è il modo sicuro per decodificare i valori a Swift 3? Ad esempio, per proteggerci dallo scenario in cui usi 'decodeInteger' e' seq2' non è un intero. Questo è stato gestito in Swift 2 usando un'istruzione 'let' per' decodeObject', ma 'decodeInteger' non restituisce un optional. – Crashalot