2017-12-05 15 views
0

iOS、Swift:再利用のためにロードできるようにカスタムオブジェクトを含む配列を保存するにはどうすればいいですか?

私は作成したオブジェクトを含む配列を持っています。私はマネージャクラスがディスクからこの配列をロードして、配列に続けて追加できるようにしたいと思います。

---ここは私がARRAYにLOADING管理するためにたいと思いクラスです

class FoodManager{ 
    var foodList : [FoodItem] 

    func addFood(name : String, carbs : Int, fat: Int, protein : Int) { 
     let food = FoodItem(name: name, carbs: carbs, protein: protein,  fat: fat) 
     foodList.append(food) 
    } 

    init(){ 
     foodList = [FoodItem]() 
     //Here is where I would like to load the array to initialize foodList or if the file doesn't exist, create a new array 

    } 
} 

-----ここにあるアレイ内のCLASS ----

class FoodItem{ 
    let name: String 
    let carbs: Int 
    let protein: Int 
    let fat: Int 

    init(name: String, carbs: Int, protein: Int, fat: Int){ 
     self.name = name 
     self.carbs = carbs 
     self.protein = protein 
     self.fat = fat 
    } 
} 

私は、プリミティブなデータ型だけではなく、ユーザー定義のオブジェクトの配列を保存する必要がある例を見つけるのが難しいクラスの保存について多くの情報を見つけました。

ありがとうございました!

+2

https://developer.apple.com/documentation/swift/encoding_decoding_and_serializationを参照してください – rmaddy

答えて

-1

NSCoderクラスを使用して、カスタムオブジェクト配列をマネージャクラスに保存する必要があります。

+0

これまでにnscoderで調査したアイブから、配列内のオブジェクトを拡張する必要がありますか? NSCoderプロトコル?マネージャークラスも同様にこれを行う必要がありますか、それはちょうど読み込みと保存を処理しますか?ありがとう – nimak

+0

私はNSCoderプロトコルを使用して問題を解決しました。ありがとうSahil! – nimak

0

これは、再利用のために保存する場合は、カスタムクラスの実装になります。あなたが使用することができますuserdefaultsに、このクラスのオブジェクトを保存するための

class FoodItem: NSCoding { 
    let name: String? 
    let carbs: Int? 
    let protein: Int? 
    let fat: Int? 

required init(name: String, carbs: Int, protein: Int, fat: Int){ 
    self.name = name 
    self.carbs = carbs 
    self.protein = protein 
    self.fat = fat 
} 

func encode(with aCoder: NSCoder) { 
    aCoder.encode(name, forKey: "name") 
    aCoder.encode(carbs, forKey: "carbs") 
    aCoder.encode(protein, forKey: "protein") 
    aCoder.encode(fat, forKey: "fat") 
} 

required init(coder aDecoder: NSCoder) { 
    self.name = aDecoder.decodeObject(forKey : "name") as? String 
    self.carbs = aDecoder.decodeObject(forKey : "carbs") as? Int 
    self.protein = aDecoder.decodeObject(forKey : "protein") as? Int 
    self.fat = aDecoder.decodeObject(forKey : "fat") as? Int 
} 
} 

let userDefaults = UserDefaults.standard 
         let encodedData = NSKeyedArchiver.archivedData(withRootObject: YourObjectToSave) 
         userDefaults.set(encodedData, forKey: "DummyName") 
         userDefaults.synchronize() 

バックに使用できるuserdefaultsからオブジェクトを取得するために:

let decoded = UserDefaults.standard.object(forKey: "DummyName") as! NSData 
let decodedClassObject = NSKeyedUnarchiver.unarchiveObject(with: decoded as Data) as! FoodItem 

EDIT:

保存FoodItemsの配列:

私はFoodItemsの配列を考えてみましょう:

let itemArray: [FoodItem] = [item1, item2, item3] 

あなたは今もこの配列を保存するために同じコードを使用することができます。

let userDefaults = UserDefaults.standard 
        let encodedData = NSKeyedArchiver.archivedData(withRootObject: YourObjectToSave) 
        userDefaults.set(encodedData, forKey: "itemArray") 
        userDefaults.synchronize() 

今すぐとして配列を取得:

let decoded = UserDefaults.standard.object(forKey: "itemArray") as! NSData 
let decodedClassObject = NSKeyedUnarchiver.unarchiveObject(with: decoded as Data) as! [FoodItem] 
+0

データを保存するのに 'UserDefaults'を使わないでください。 – rmaddy

+0

私は返事を感謝しますが、それでも私の質問には答えません。私は多かれ少なかれ1つのオブジェクトを保存する方法を理解しています。私がしたいのは、多くのFoodItemオブジェクトを含む配列を保存することです。 – nimak

+0

@nimak:カスタムオブジェクトの配列を保存するコードを追加しました。 –

関連する問題