IOS
 Computer >> コンピューター >  >> プログラミング >> IOS

NSUserDefaultsにカスタムオブジェクトを保存する方法は?


この記事では、アプリケーションにカスタムオブジェクトを保存する方法を学習しますが、カスタムオブジェクトを保存する方法を学習する前に、カスタムオブジェクトとは何かを見てみましょう。

カスタムオブジェクトとは、クラスや構造、またはInt、Double、Stringなどのネイティブデータ型ではないその他のデータです。NSUserDefaultsへのデータの保存は3段階のプロセスです。

カスタムオブジェクトの作成

年齢変数と名前変数を持つカスタムクラスPersonを作成します。

class Person: NSObject, NSCoding {
   var name: String
   var age: Int
   init(name: String, age: Int) {
      self.name = name
      self.age = age
   }
   required convenience init(coder aCoder: NSCoder) {
      let name = aCoder.decodeObject(forKey: "name") as! String
      let age = aCoder.decodeInteger(forKey: "age")
      self.init(name: name, age: age)
   }
   func encode(with acoder: NSCoder) {
      acoder.encode(age,forKey: "age")
      acoder.encode(name,forKey: "name")
   }
}

カスタムオブジェクトのエンコード

このステップでは、personオブジェクトの配列を作成し、それをpeopleと呼び、ランダムデータで初期化します。そのオブジェクトを作成したら、NSKeyedArchiverを使用してこのオブジェクトをアーカイブし、後でuserDefaultsに保存します。

let people = [
   Person.init(name: "P1", age: 1),
   Person.init(name: "P2", age: 2),
   Person.init(name: "P3", age: 3),
]
let encoded = NSKeyedArchiver.archivedData(withRootObject: people)
UserDefaults.standard.set(encoded, forKey: "encodedData")

これで、アーカイブされたオブジェクトがコアデータに正常に保存されました。次に、そのオブジェクトをアーカイブ解除して印刷します。

カスタムオブジェクトのデコード

NSKeyedArchiverと同様に、このオブジェクトのアーカイブを解除するために使用するNSKeyedUnarchiverがあります。

let decoded = UserDefaults.standard.object(forKey: "encodedData") as! Data
let decodedPeople = NSKeyedUnarchiver.unarchiveObject(with: decoded) as! [Person]

これで、この「decodedPeople」オブジェクトには、2番目のステップで作成したオブジェクトが含まれます。

atオブジェクトを使用して目的の操作を実行できます。次に、ViewControllerファイルがどのように見えるかを見てみましょう。

import UIKit
class ViewController: UIViewController {
   override func viewDidLoad() {
      super.viewDidLoad()
      // Do any additional setup after loading the view, typically from a nib.
      let people = [
         Person.init(name: "P1", age: 1),
         Person.init(name: "P2", age: 2),
         Person.init(name: "P3", age: 3),
      ]
      let encoded = NSKeyedArchiver.archivedData(withRootObject: people)
      UserDefaults.standard.set(encoded, forKey: "encodedData")
      print("data decoded, encoding now")
      let decoded = UserDefaults.standard.object(forKey: "encodedData") as! Data
      let decodedPeople = NSKeyedUnarchiver.unarchiveObject(with: decoded) as! [Person]
      print(decodedPeople)
   }
}

最後のprintステートメントにブレークポイントを設定してこのコードを実行し、実行時にこのコマンドを実行します

po decodedPeople.first?.name

結果として

Optional<String>
- some : "P1"

これが最終的にどのように見えるかです。

NSUserDefaultsにカスタムオブジェクトを保存する方法は?


  1. カスタムオブジェクトをシリアル化するにはどうすればよいですか?

    この例は、カスタムオブジェクトをシリアル化できるようにする方法を示しています ステップ1 − Android Studioで新しいプロジェクトを作成し、[ファイル]⇒[新しいプロジェクト]に移動して、新しいプロジェクトを作成するために必要なすべての詳細を入力します。 ステップ2 −次のコードをres / layout/activity_main.xmlに追加します。 <?xml version = "1.0" encoding = "utf-8"?> <LinearLayout xmlns:android = "http:

  2. カスタムオブジェクトをパーセル可能にするにはどうすればよいですか?

    この例は、カスタムオブジェクトをパーセル可能にする方法を示しています ステップ1 − Android Studioで新しいプロジェクトを作成し、[ファイル]⇒[新しいプロジェクト]に移動して、新しいプロジェクトを作成するために必要なすべての詳細を入力します。 ステップ2 −次のコードをres / layout/activity_main.xmlに追加します。 <?xml version = "1.0" encoding = "utf-8"?> <LinearLayout xmlns:android = "https://sc