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