[Swift] UserDefaults: Custom Object(Model) 저장하기

Posted by Sung Kyungmo on August 17, 2020

UserDefaults에 Custom Object(Model) 저장하기

Sample model 생성

1
2
3
4
struct Genre: Codable {
    let id: Int!
    let name: String!
}

UserDefaults에 저장할 샘플 데이터를 만들겠습니다.

genre와 여러개의 Genre를 가지는 genres array 두가지 샘플을 생성합니다.

1
2
3
4
5
6
7
8
var genre = Genre(id: 1, name: "액션")

// Array
var genres: [Genre] = [
    Genre(id: 1, name: "액션"),
    Genre(id: 2, name: "로맨스"),
    Genre(id: 3, name: "공포")
]

UserDafaults에 Object 저장

genre, genres를 key값으로 데이터를 PropertyListEncoder로 인코딩하여 저장합니다.

1
2
3
4
UserDefaults.standard.set(try? PropertyListEncoder().encode(genre), forKey:"genre")

// Array
UserDefaults.standard.set(try? PropertyListEncoder().encode(genres), forKey:"genres")

UserDefaults에서 Object 가져오기

저장할때 사용했던 Key값으로 데이터를 가져온후 PropertyListDecoder로 디코딩합니다.

1
2
3
4
5
6
7
8
if let data = UserDefaults.standard.value(forKey:"genre") as? Data {
    let genre = try? PropertyListDecoder().decode(Genre.self, from: data)
}

// Array
if let data = UserDefaults.standard.value(forKey:"genres") as? Data {
    let genres = try? PropertyListDecoder().decode([Genre].self, from: data)
}

UserDefaults Custom Object(Model) 활용하기

Computed Property를 활용하여 UserDefaults에 데이터를 더 쉽에 읽고 쓸 수 있습니다.

get에서는 UserDefaults에 저장되어있는 데이터를 가져와 디코딩한후 반환합니다. 데이터가 없거나 디코딩이 실패하면 예제처럼 빈배열을 반환하거나 입맛에 맞게 nil을 반환하면 됩니다.

set에서는 newValue를 인코딩하여 UserDefaults에 저장합니다.

1
2
3
4
5
6
7
8
9
10
11
12
static var movieGenres: [Genre] {
    get {
        var genres: [Genre]?
        if let data = UserDefaults.standard.value(forKey:"genres") as? Data {
            genres = try? PropertyListDecoder().decode([Genre].self, from: data)
        }
        return genres ?? []
    }
    set {
        UserDefaults.standard.set(try? PropertyListEncoder().encode(newValue), forKey:"genres")
    }
}