2016-07-27 22 views
8

私はPersonというカスタムクラスを持っています。カスタムクラスは、情報を入力するときに、誰かのさまざまな属性を格納します。NSUserDefaultsを使用してカスタムクラスの配列をSwiftに格納する方法は?

class Person { 

    // Person dictionary variable 
    var name: String? 
    var age: String? 
    var html_url: String? 

    init(json: NSDictionary) { // Dictionary object 
     self.name = json["name"] as? String 
     self.age = json["age"] as? String 
     self.html_url = json["html_url"] as? String // Location of the JSON file 
    } 
} 

ディクショナリが作成されると、ディクショナリが配置されます。ボタンをタップすると、配列をNSUserDefaultsに保存する際に問題が発生します。

personArray.append(newPerson) // newPerson = dictionary of attributes 


NSUserDefaults.standardUserDefaults().setObject(personArray, forKey: "personArray") 
     NSUserDefaults.standardUserDefaults().synchronize() 

私はHow to store custom objects in NSUserDefaultsSaving custom SWIFT class with NSCoding to UserDefaultsを見て持っていたが、私は運がなかったしていると、それは難しい理解して見つけています。

はI私は単にNSUserDefaultsに保存しようと、私は聞いています次:

Attempt to set a non-property-list object (
    "PersonApp.Person" 
) as an NSUserDefaults/CFPreferences value for key personArray 

は、誰も私が実際にNSUserDefaultsを経由してカスタムオブジェクト(カスタム辞書)の配列を救うことはできますか?

+1

スウィフト3しかし、これはまさにあなたがやろうとしていることです。http://stackoverflow.com/a/37983027/2303865 –

答えて

13

あなたのPersonクラスは次のようになります。この例をチェックアウト

let p = Person() 
p.name = "person1" 
p.age = "12" 
p.html_url = "www.google.ro" 

let p2 = Person() 
p2.name = "person2" 
p2.age = "11" 
p2.html_url = "www.google.ro" 

let array = [p, p2] 

let userDefaults = NSUserDefaults.standardUserDefaults() 
userDefaults.setValue(NSKeyedArchiver.archivedDataWithRootObject(array), forKey: "persons") 
userDefaults.synchronize() 

let array : [Person] 
array = NSKeyedUnarchiver.unarchiveObjectWithData(userDefaults.objectForKey("persons") as! NSData) as! [Person] 
print("\(array[0].name)\(array[1].name)") 

スイフト4:

class Person : NSObject, NSCoding{ 

    // Person dictionary variable 
    var name: String? 
    var age: String? 
    var html_url: String? 

    init(json: NSDictionary) { // Dictionary object 
     self.name = json["name"] as? String 
     self.age = json["age"] as? String 
     self.html_url = json["html_url"] as? String // Location of the JSON file 
    } 

    required init?(coder aDecoder: NSCoder) { 
     self.name = aDecoder.decodeObject(forKey: "name") as? String; 
     self.age = aDecoder.decodeObject(forKey: "age") as? String; 
     self.html_url = aDecoder.decodeObject(forKey: "html") as? String; 
    } 

    func encode(with aCoder: NSCoder) { 
     aCoder.encode(self.name, forKey: "name"); 
     aCoder.encode(self.age, forKey: "age"); 
     aCoder.encode(self.html_url, forKey: "html"); 
    } 
} 
5

NSCodingプロトコルを実装して、カスタムオブジェクトをNSUserDefaultsに保存する必要があります。あなたが保存してNSUserDefaultsから配列を取得する例を持って

class Person : NSObject, NSCoding{ 

    // Person dictionary variable 
    var name: String? 
    var age: String? 
    var html_url: String? 

    init(json: NSDictionary) { // Dictionary object 
     self.name = json["name"] as? String 
     self.age = json["age"] as? String 
     self.html_url = json["html_url"] as? String // Location of the JSON file 
    } 

    required init?(coder aDecoder: NSCoder) { 

     self.name = aDecoder.decodeObjectForKey("name") as? String; 
     self.age = aDecoder.decodeObjectForKey("age") as? String; 
     self.html_url = aDecoder.decodeObjectForKey("html") as? String; 
    } 

    func encodeWithCoder(aCoder: NSCoder) { 
     aCoder.encodeObject(self.name, forKey: "name"); 
     aCoder.encodeObject(self.age, forKey: "age"); 
     aCoder.encodeObject(self.html_url, forKey: "html"); 
    } 
} 

そして、ここで:

スウィフト3:http://nshipster.com/nscoding/

0

スウィフト4

  • JsonEncoderクラスを使用して、クラスに確認コード可能なプロトコル
  • シリアル化(データ)あなたのオブジェクトは、今

userDefaultsにデータを保存します明確なアイデアを得るにはこの答えを参照してください Save Array of Custom Swift object to userDefaults

関連する問題