UserDefaults의 원리
- 저장: 요청 > struct 객체 > Data형 > 메모리, 디스크에 저장
* 아카이빙: 객체를 Data형과 같이 바이트 형태로 변경하는 작업이며 객체를 메모리, 디스크에 저장할 수 있는 파일 형시으로 만드는 것
- 로드: 요청 > 메모리, 디스크에 저장된 형태 탐색 > Data형 > struct객체로 변환 > 획득
* 언아카이빙: 메모리, 디스크에 저장된 Data형태의 바이트 형태를 스위프트의 struct 객체외 같은 형태로 변경하는것.
기본 타입인 Int, Double, String은 아카이빙, 언아카이빙이 내부적으로 UserDefaults를 사용할 때 적용이 되어서 바로 사용 가능하지만, struct같은 사용자 지정 타입의 경우 아카이빙, 언아카이빙 작업이 별도로 필요하다.
아카이빙, 언아카이빙은 JSON Encoder, JSON Decoder를 활용한다. Encoder와 Decoder를 사용하기 위해 struct는 Codable이란 프로토콜을 준수해야한다.
struct Person: Colable{
let name: String
let age: Int
}
저장
JSONEncoder를 이용하여 객체를 아카이빙
let person = Person(name: "jake", age: 20)
let enconder = JSONEncoder()
//encoded는 Data형
if let encoded = try? encoder.encode(person){
UserDefaults.standard.setValue(encoded, forKey: "person")
}
저장할 때 Key를 "person"으로 지정을 해주고 읽어올 때 "person"이란 키로 읽어오게 된다.
로드
JSONDecoder를 이용 언아카이빙하여 로드
if let saved Data = UserDefaults.standard.object(forKey: "person") as? Data{
let decoder = JSONDecoder()
if let savedObject = try? decoder.decode(Person.self, from: savedData){
print(savedObject) //Person(name: "jake", age: 20)
}
}
decode없이 로드시 Data형태로 로드
let savedPerson = UserDefaults.standard.object(forKey: "person")
print(savedPerson) //Optional(<7b226e61 6d65223a 226a616b 65222c22 61676522 3a32307d>)
구조체형태의 Struct를 저장과 로드
var PersonList = [Persont]()
//로드
if let savedData = UserDefaults.standard.object(forKey: "person") as? Data{
let decoder = JSONDecoder()
if let savedObject = try? decoder.decode([Person].self, from: savedData){
PersonList = savedData
print(PersonList) //Person(name: "jake", age: 20), Person(name: "cake", age: 30)
}
}
// 바로 읽어옴.
guard let data = UserDefaults.standard.value(forKey: "alert") as? Data,
let alerts = try? PropertyListDecoder().decode([Alert].self, from: data) else { return [] }
//저장
let encoder = JSONEncoder()
if let encoded = try? encoder.encode(PersonList){
UserDefaults.standard.setValue(encoded, forKey: "person")
}
// 바로 저장
UserDefaults.standard.set(try? PropertyListEncoder().encode(self.alerts), forKey: "alerts")