[iOS] UserDefaults에 객체 저장하기 (Encode & Decode Object in UserDefaults Data )
안녕하세요 Foma 입니다!
오늘은 UserDefaults에 객체를 저장하는 법에 대해서 알아볼건데요.
저는 UserDefaults에 모델 자체를 넣고 저장하고 싶은데 그게 잘 안되더라구요...
그래서 열심히 구글링해서 알게된 방법을 정리해보려고 합니다!
바로 시작할게요!
Food
저는 제가 먹었던 음식의 이름,가격,맛있었는지 여부를 파라미터로 가지고 있는 음식이라는 구조체를 만들게요!
Codable은 UserDefaults에 저장하고 빼오기 위해서 Encode,Decode 과정이 필요하기 때문에 채택하였고
Equatable은 Food객체를 서로 비교하기 위해 채택하였습니다.
import Foundation
struct Food:Codable,Equatable{
let name:String
let price:Int
let isDelicious:Bool
}
FoodViewController
UserDefaults 인코딩
이제 ViewController로 이동해서 userDefaults와 Food를 담을 allFoods를 만들어줍니다.
let userDefaults = UserDefaults.standard
var allFoods:[Food]?
그리고 모든 음식을 저장하기 위해서 Food를 파라미터로 받는 saveAllFoods 함수를 만들어주세요.
만약 allFoods에 아무것도 없고 파라미터로 받는 food를 포함하고 있지않다면 allFoods에 append 해줍니다.
아니라면 allFoods에 food만 담긴 배열을 만들어줍니다.
private func saveAllFoods(food:Food) {
if allFoods != nil {
if !allFoods!.contains(food) {
allFoods!.append(food)
}
}else{
allFoods = [food]
}
userDefaults.setValue(try? PropertyListEncoder().encode(allFoods!), forKey: "Foods")
}
그리고 그 다음 줄에 중요한게 나오는데요. 바로 PropertyListEncoder입니다.
애플 문서에 들어가서 해석해보니 객체들을 property list로 encoding해주는 클래스라고 되어있네요.
PropertyListEncoder를 사용해서 allFoods를 인코딩해준 뒤 userDefaults에 기억해둘 키를 정해줍니다.
그리곤 음식 객체들을 allFoods에 append하고 allFoods안에 있는 객체들을 모두 저장해줍니다.
private func addFood() {
let 짜장면 = Food(name: "짜장면", price: 6000, isDelicious: true)
let 샐러드 = Food(name: "샐러드", price: 4500, isDelicious: false)
let 소고기 = Food(name: "소고기", price: 25000, isDelicious: true)
allFoods = [짜장면,샐러드,소고기]
for food in allFoods!{
saveAllFoods(food: food)
}
}
UserDefaults Decode
그렇다면 이제 userDefaults안에 있는 객체들을 꺼내봐야겠죠?
인코딩할 때와 같이 PropertyListDecoder를 사용해서 디코딩해줍니다.
Food객체가 담긴 allFoods라는 Array를 사용했으므로 Array<Food>.self를 넣어주세요.
private func loadAllFoods() {
if let data = userDefaults.value(forKey: "Foods") as? Data {
allFoods = try? PropertyListDecoder().decode(Array<Food>.self,from: data)
}
}
그럼 한번 확인해볼까요?
먼저 addFood를 실행시켜서 음식들을 UserDefaults에 저장해준 뒤
override func viewDidLoad() {
super.viewDidLoad()
addFood()
}
앱을 끄고 나서 다시 loadAllFoods를 실행시켜준 뒤 allFoods를 출력해보면
override func viewDidLoad() {
super.viewDidLoad()
loadAllFoods()
print(allFoods)
}
저장한 짜장면,샐러드,소고기 이렇게 Food객체가 잘 저장된 것을 볼 수 있습니다!!