์๋ ํ์ธ์ 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๊ฐ์ฒด๊ฐ ์ ์ ์ฅ๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค!!
๋๊ธ