1. ホーム
  2. ios

[解決済み] 構造をUserDefaultsに保存する

2023-07-28 16:34:38

質問

UserDefaults に保存したい構造体があります。以下は、私の構造体です。

struct Song {
    var title: String
    var artist: String
}

var songs: [Song] = [
    Song(title: "Title 1", artist "Artist 1"),
    Song(title: "Title 2", artist "Artist 2"),
    Song(title: "Title 3", artist "Artist 3"),
]

別のViewControllerで、この構造体に追加するUIButtonを以下のように作成しています。

@IBAction func likeButtonPressed(_ sender: Any) {   
   songs.append(Song(title: songs[thisSong].title, artist: songs[thisSong].artist))
}

ユーザーがそのボタンをクリックするたびに、構造体が UserDefaults に保存され、ユーザーがアプリを終了して再び開いたときに保存されるようにしたいのです。どのようにしたらよいでしょうか。

どのように解決するのですか?

Swift 4では、これはかなり些細なことです。Codableプロトコルを採用するようにマークすることによって、構造体をCodableにします。

struct Song:Codable {
    var title: String
    var artist: String
}

では、さっそくデータを見てみましょう。

var songs: [Song] = [
    Song(title: "Title 1", artist: "Artist 1"),
    Song(title: "Title 2", artist: "Artist 2"),
    Song(title: "Title 3", artist: "Artist 3"),
]

これをUserDefaultsに取り込む方法を説明します。

UserDefaults.standard.set(try? PropertyListEncoder().encode(songs), forKey:"songs")

そして、後でまた取り出す方法を紹介します。

if let data = UserDefaults.standard.value(forKey:"songs") as? Data {
    let songs2 = try? PropertyListDecoder().decode(Array<Song>.self, from: data)
}