티스토리 뷰
장점 : 앱을 끄면 삭제되는 AppDelegate 변수들과는 달리, 앱을 삭제하기 전까지는 반영구적으로 저장된다.
내부적으로는 plist 파일을 통해서 저장한다. 기본 자료형까지 바로 사용이 가능하다.
[사용법]
- 저장할 때
UserDefaults.standard.setValue(id, forKey: "id")
- 받아올 때
// String
UserDefaults.standard.string(forKey: "")
// Bool
UserDefaults.standard.bool(forKey: "")
// Double
UserDefaults.standard.double(forKey: "")
// 배열
UserDefaults.standard.object(forKey: "") as? [String]
이런식으로 사용한다.
String만 옵셔널 타입이고, 나머지 Bool이나 Double 타입은 일반 타입이니까 옵셔널 해제 없이 바로 써도 된다.
하지만, custom object를 저장하고, 불러오고 싶으면 어떻게 해야할까?
크게 class로 하는 방식, struct로 하는 방식 두가지가 있다.
Custom Object 저장하기
1. class로 하는 방식
class authListClass: NSObject, NSCoding {
func encode(with coder: NSCoder) {
return
}
let key: Int
let desc: String
// Memberwise initializer
init(key: Int, desc: String) {
self.key = key
self.desc = desc
}
// MARK: NSCoding
required convenience init?(coder decoder: NSCoder) {
guard let key = decoder.decodeObject(forKey: "key") as? Int,
let desc = decoder.decodeObject(forKey: "desc") as? String else { return nil }
self.init(key: key, desc: desc)
}
func encodeWithCoder(coder: NSCoder) {
coder.encode(key, forKey: "key")
coder.encode(desc, forKey: "desc")
}
}
/// 전체 권한 목록
static var accountAuthList: [authListClass]? {
get {
guard let data = UserDefaults.standard.object(forKey: Keys.accountAuthList) as? NSData else { return nil }
return NSKeyedUnarchiver.unarchivedObject(ofClass: [authListClass], from: data as Data) as! [authListClass]
}
set {
let data = NSKeyedArchiver.archivedData(withRootObject: newValue)
UserDefaults.standard.set(data, forKey: Keys.accountAuthList)
}
}
}
2. struct로 하는 방식
extension UserDefaults {
private struct Keys {
static let categories = "Categories"
}
static var categories: [Categories]? {
get {
guard let data = standard.object(forKey: Keys.categories) as? Data else { return nil }
let decoder = JSONDecoder()
return try? decoder.decode([Categories].self, from: data)
}
set {
let encoder = JSONEncoder()
if let encoded = try? encoder.encode(newValue) {
standard.set(encoded, forKey: Keys.categories)
}
}
}
}
모델은 Api 파싱해오는 모델 그대로 썼다.
[참고]
'macOS, iOS' 카테고리의 다른 글
[iOS] button에 shadow 주기 (0) | 2020.07.03 |
---|---|
[iOS] codable key안에 .이 들어있을 때 (0) | 2020.07.02 |
[iOS] custom tableview cell의 button 액션 처리하기 (0) | 2020.07.01 |
[iOS] storyboard에서 navigation bar 숨기기 (0) | 2020.06.30 |
[iOS] xib의 outlet은 처음에 nil이다. (0) | 2020.06.27 |