2017-11-13 9 views
0

UserDefaultsを使用して以下のデータを保存しようとしていますが、isDefaultブールを渡すと機能しません。しかし、もし私がisDefaultを削除してもうまくいきます。 NSCodingBoolの観点から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

で、それはObjective-CのタイプではありませんdecodeBool(forKey

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

専用のメソッドを使用します。このアプローチを廃止し、Swift 4で 'Codable'を使用することをお勧めします。 –

+1

"動作しません "を定義します。それは役に立たない。どのようにして正確には機能しませんか? – rmaddy

+0

@JonShier iOS 10でもサポートします。 – Nitesh

答えて

2

オブジェクトではありません。結果はあなたが `NSCoder`を使用して` Bool`をエンコードすることができない非オプションBool