-
UserDefaults을 이용하여 로컬에 데이터 저장하기(2) - Encoder & Decoder데이터 저장/데이터 저장 in 로컬 : UserDefaults 2022. 8. 18. 11:36
이전에 userDefaults에 데이터를 저장하면서 타입캐스팅 방식을 이용했는데,
사실, userDefaults에 저장할 데이터로서 적정한 것들이라면 타입캐스팅까지도 필요하지 않을 것이란 생각이 든다.
그래도 아직 다른 저장방식을 배우지 않은 상태에서 예제를 계속 하다 보니 타입캐스팅이 까다롭다고 느껴졌고,
그러다 강의에서 배웠던 JsonEncoder & Decoder가 생각나서 시도해봤는데 잘 되었다.
그래서 검색을 해보니 인코딩&디코딩에 JSON과 Property list 두 가지 방식이 있었다.
방법은 거의 동일해서
그 방식을 간단하게 정리해보면
우선 첫번째는 저장할 데이터의 타입을 Codable로 선언해야 한다.
struct NewAlram: Codable { var id = "" let date: Date var isOn: Bool }
Codable을 encode와 decode가 모두 가능하다.
이제 userDefaults에 저장할 데이터를 만들어 보면 아래와 같이 한 줄로 끝이다.
func saveLocalData() { let userDefaults = UserDefaults.standard let data = try? JSONEncoder().encode(alramList) userDefaults.set(data, forKey: "alramList") }
저장된 데이터를 불러올 때도 한 줄로 끝이다.
func loadLocalData() { let userDefaults = UserDefaults.standard guard let data = userDefaults.data(forKey: "alramList"), let savedData = try? JSONDecoder().decode([NewAlram].self, from: data) else { return } self.alramList = savedData }
타입캐스팅 방식과 비교해보면
1. 저장
A. 타입 캐스팅
let data = alramList.map { [ "id": $0.id, "date": $0.date, "isOn": $0.isOn ] }
B. Json
let data = try? JSONEncoder().encode(alramList)
C. PropertyList
let data = try? PropertyListEncoder().encode(alramList)
2. 로드
A. 타입캐스팅
func loadLocalData() { let userDefaults = UserDefaults.standard guard let data = userDefaults.array(forKey: "alramList") as? [[String: Any]] else { return } alramList = data.compactMap { guard let id = $0["id"] as? String else { return nil } guard let date = $0["date"] as? Date else { return nil } guard let isOn = $0["isOn"] as? Bool else { return nil } return NewAlram(date: date, isOn: isOn) } }
B. Json
guard let data = userDefaults.data(forKey: "alramList"), let savedData = try? JSONDecoder().decode([NewAlram].self, from: data) else { return } self.alramList = savedData
C. PropertyList
guard let data = userDefaults.data(forKey: "alramList"), let savedData = try? PropertyListDecoder().decode([NewAlram].self, from: data) else { return } self.alramList = savedData
userDefaults에 저장할 데이터가 타입캐스팅이 필요한 정도라면 codable 방식을 쓰는 게 나을 것 같다.
'데이터 저장 > 데이터 저장 in 로컬 : UserDefaults' 카테고리의 다른 글
UserDefaults을 이용하여 로컬에 데이터 저장하기(1) (0) 2022.08.17