print(NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).last! as String)
UserDefaults는 DB처럼 사용해서는 안된다. UserDefaults의 plist를 전부 읽은 이후에 동기적으로 사용할 수 있으므로 크기가 큰 데이터를 UserDefaults에 넣으면 안된다.
import Foundation
let defaults = UserDefaults.standard
defaults.set(24.0, forKey: "musicVolume")
defaults.set(true, forKey: "musicOn")
defaults.set([1, 2, 3], forKey: "myArray")
defaults.set(["first": 1, "second": 2, "third": 3], forKey: "myDictionary")
let volume = defaults.double(forKey: "musicVolume")
let isOn = defaults.bool(forKey: "musicOn")
let myArray = defaults.array(forKey: "myArray")
let myDictionary = defaults.dictionary(forKey: "myDictionary")
UserDefaults는 singleton으로 관리된다.
UserDefaults를 사용하면 기본 자료형의 딕셔너리만 사용할 수 있다.
let dataFilePath = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first?.appendingPathComponent("Items.plist")
func saveItems() {
let encoder = PropertyListEncoder()
do {
let data = try encoder.encode(itemsArray)
try data.write(to: dataFilePath!)
} catch {
print("Error encoding items : \(error)")
}
tableView.reloadData()
}
func loadItems() {
if let data = try? Data(contentsOf: dataFilePath!) {
let decoder = PropertyListDecoder()
do {
itemsArray = try decoder.decode([Item].self, from: data)
} catch {
print("Error decoding items : \(error)")
}
}
tableView.reloadData()
}