UserDefaults

기본 사용법

  • 값을 저장 할 때는
UserDefaults.standard.set(value, forKey: "Some Key Name")
UserDefaults.synchronize()
  • 값을 불러올 때는
// 걍 불러오기.
let value = UserDefaults.standard.object(forKey: "Some Key Name") as? String

// 타입을 명확히하기.
let value = UserDefaults.standard.string(forKey: "Some Key Name")
  • 불러올 시에는 저장된 값이 없을수도 있어서 모두 옵셔널을 리턴한다는 것도 잊지 말자. 반대로 이를 이용해 기본값을 제공하는 방법도 생각해 볼 수 있다.
var userName: String {
  return UserDefaults.standard.string(forKey: "User Name") ?? "Noname"
}

복잡한 데이터의 경우

배열(Array) 이나 사전형(Dictionary) 같은 콜렉션 타입은 들어가게 되는 아이템의 타입에 종속적이지 않다보니 쉽게 기록하거나 읽을 수 없다. (물론 [String : String] 같은 단순한 타입이면 모르겠지만) ... 대신 NSKeyedArchiver 나 NSKeyedUnarchiver 를 이용해 Data(NSData) 형식으로 인코딩한 후 기록하고나 디코딩해서 읽을 수 있다.

아래 예제는 기본적인 사전형 데이터를 UserDefaults 에 쓰기 위한 예제이다.

let data = NSKeyedArchiver.archivedData(withRootObject: someDictionary)
UserDefaults.standard.set(data, forKey: "Some Dictionary Data")

반대로 읽을 때는 읽은 데이터에서 언아카이버로 디코딩을 해야 한다.

if let data = UserDefaults.standard.object(forKey: "Some Dictionary Data") as? Data {
  let someDictionary = NSKeyedUnarchiver.unarchiveObject(with: data) as? [AnyHashable : Any]
}

두 단계로 나눠서 읽거나 써야하는 만큼 귀찮아 지긴 하지만 콜렉션 타입의 경우 내부에 들어오는 타입을 명확히 알기가 힘든 경우가 있으므로 종종 이용해야 할 수 있다.

// 참조
http://seorenn.blogspot.kr/2017/01/userdefaults-nsuserdefaults.html

results matching ""

    No results matching ""