티스토리 뷰

장점 : 앱을 끄면 삭제되는 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 파싱해오는 모델 그대로 썼다. 

 

 

[참고]

nshipster.com/nscoding/

www.hackingwithswift.com/example-code/system/how-to-load-and-save-a-struct-in-userdefaults-using-codable

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함