2017-11-13 2 views
0

Ich versuche, unter Daten unter UserDefaults speichern, aber wenn ich isDefault bool übergeben, funktioniert es nicht. Aber wenn ich isDefault entferne, funktioniert es gut.UserDefaults Bool FAIL

https://gist.github.com/n1tesh/4de0fea9514e392e35e241786f51e98b

struct User { 

    var userContact = CNContact() 
    var recipientContact: CNContact? 
    var isDefault: Bool = false 
    init(userContact: CNContact, recipientContact: CNContact? = nil, isDefault: Bool) { 
     self.userContact = userContact 
     self.recipientContact = recipientContact 
     self.isDefault = isDefault 
    } 

} 

extension User { 
    @objc(_TtCV6testUD4User6Coding)class Coding: NSObject, NSCoding { 

     let model: User? 

     init(model: User) { 
      self.model = model 
      super.init() 
     } 

     func encode(with aCoder: NSCoder) { 
      guard let model = self.model else { 
       return 
      } 

      aCoder.encode(model.userContact, forKey: "userContact") 
      aCoder.encode(model.recipientContact, forKey: "recipientContact") 
      aCoder.encode(model.isDefault, forKey: "isDefault") 

     } 

     required init?(coder aDecoder: NSCoder) { 
      guard let userContact = aDecoder.decodeObject(forKey: "userContact") as? CNContact,let isDefault = aDecoder.decodeObject(forKey: "isDefault") as? Bool else { 
        return nil 
      } 
      let recipientContact = aDecoder.decodeObject(forKey: "recipientContact") as? CNContact 

      model = User(userContact: userContact, recipientContact: recipientContact, isDefault: isDefault) 
      super.init() 
     } 

    } 
} 
+0

Sie können nicht kodieren für ein 'Bool' mit' NSCoder', es ist nicht ein Objective-C-Typ. Ich schlage vor, dass Sie diesen Ansatz verwerfen und nur "Codable" in Swift 4 verwenden. –

+1

Definieren Sie "funktioniert nicht". Das ist nicht hilfreich. Wie genau funktioniert es nicht? – rmaddy

+0

@JonShier Ich möchte, dass es auch auf iOS 10 unterstützt. – Nitesh

Antwort

2

In Bezug auf die NSCodingBool ist kein Objekt. Verwenden Sie die spezielle Methode decodeBool(forKey

let isDefault = aDecoder.decodeBool(forKey: "isDefault") 

Das Ergebnis ist ein nicht-optional Bool