예를 들어, '오늘의 할 일'을 적어두는 앱에 오늘 무엇을 할지를 기록하고 있다고 가정하자.
다 기록을 하고 나서 시간이 지난 뒤, 확인하려고 했을 때 기록한 내용이 삭제되었다면 얼마나 허무할 것인가? 이러한 사고를 방지하기 위해 UserDefaults
를 사용해 Persistent Local Data를 저장할 수 있다.
[File]-[New]-[Playground]를 클릭하여 Playground
에서 연습을 통해 익숙해지려고 한다.
let defaults = UserDefaults.standard
set 메서드를 사용해 Any?
, Int
, Double
, Bool
, Float
, URL?
데이터 타입을 설정할 수 있다.
defaults.set(Date(), forKey: "AppLastOpendByUser") // Any?
let appLastOpen = defaults.object(forKey: "AppLastOpendByUser") // Jan 29, 2022 at 10:44 PM
defaults.set("silverCastle", forKey: "PlayerName") // String
let playerName = defaults.string(forKey: "PlayerName") // silverCastle
defaults.set(true, forKey: "MusicOn") // Bool
let musicOn = defaults.bool(forKey: "MusicOn") // true
defaults.set(0.24, forKey: "Volume") // Float
let volume = defaults.float(forKey: "Volume") // 0.24
여기서 array의 경우에는 실질적으로 리턴 타입이 optional 배열이기 때문에 배열 내부에 포함된 원소들의 데이터 타입을 알지 못한다. 따라서 아래와 같이 보다 명시적으로 as!
을 사용해 정수형 배열로 다운캐스팅을 할 수 있다.
let array = [1,2,3]
defaults.set(array, forKey: "myArray") // Any?
let myArray = defaults.array(forKey: "myArray") as! [Int] // [1,2,3]
UserDefaults가 어디에 저장되어 있는지 알고싶다면
AppDelegate
의 didFinishLaunchingWithOptions
func에서 아래의 print를 넣어서 알 수 있다.
print(NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).last! as String)
하지만, 많은 양의 데이터를 저장한다면 저장한 모든 항목을 로드해야 하므로 많은 시간이 걸릴 것이다.
UserDefaults는 데이터베이스가 아니라서 앱의 속도와 효율성에 상당한 영향을 미치기 때문에 적은 양의 데이터를 저장하고 싶을 때 사용해야 함을 기억하자.