- 데이터를 key-value 쌍으로 데이터베이스에 영구적으로 저장하는 인터페이스
- 예를 들어 메모장 앱을 만들었을 때, 앱을 종료해도 메모들이 남아 있어야겠지 🤔 이럴 때 사용하는 것!
UserDefaults.standard.set(Any?, for key: String)
📚 Any?
: 저장하고 싶은 값
📚 for key
: 저장한 값을 부를 key name
(저장하고 싶은 값에는 다양한 type의 파라미터가 들어갈 수 있음)
UserDefaults.standard.value(for key: String)
📚 for key
: 저장할 때 지정해 주었던 key name을 적어 준다
(불러올 데이터의 타입에 따라 메서드 이용)
UserDefaults.standard.removeObject(for key: String)
📚 for key
: 마찬가지로 저장할 때 지정해 주었던 key name을 적어 준다
무음 모드를 관리하는 앱이 있다고 가정해 보자. (실제로 무음 기능을 추가하진 않았지만,, ^^)
switch 버튼 On - 무음 모드 켜짐
switch 버튼 Off - 무음 모드 꺼짐
당연히 앱이 종료되었다 켜져도 무음 모드였다면 무음 모드가 유지되어야 하고, 소리 모드였다면 소리 모드가 유지되어야 함.
UserDefaults를 사용하지 않으면, 데이터가 유지되지 않음!
📚 switchButton
: 스위치 버튼의 outlet 변수
📚 tapSwitchButton
: 스위치 버튼을 tap했을 때의 Action
나는 함수로 구현해 보았다!
📚 저장한 데이터: switchButton.isOn
을 저장하였음. (Bool 타입이므로 on일 때는 true, off일 때는 false를 반환할 것)
📚 key 이름은 "switch"로 지정해 주었다.
잘 생각해 보면 🤔 데이터가 변경될 때마다 값을 저장해 주어야 함을 알 수 있음.
따라서 tapSwitchButton Action 안에 함수를 호출해 준다.
switch가 on/off 될 때마다 값이 저장되도록!
(물론 함수로 구현하지 않아도 됨)
2개의 방식으로 구현해 보았다.
📚 func bool(forKey: String) -> Bool
Bool 타입으로 값을 불러와 switchButton.isOn에 저장하였다.
📚 func object(forKey: String) -> Any?
Any? 타입으로 값을 불러와 switchButton.isOn에 저장하기 위해 Bool 타입으로 타입 캐스팅해 주었음.
Any? 때문에 옵셔널 바인딩이 필요하다.
viewDidLoad()
가 일어날 때마다 값을 새로 불러와야 하므로, viewDidLoad()
에 호출해 주기
UserDefaults 이름을 처음 들었을 땐 너무... 있어 보이게 생겨서 어려울 것 같았는데 개념 자체는 괜찮았다.
그치만... ㅜ
일기장 앱을 만들고 있는데, 특히 구조체 배열을 저장하고 불러올 때 map하고 compactMap하는 부분이 많이 헷갈려서 삽질을 했다...
클로저가 아직 많이 미숙했던 것을 느낌 🥲
출처)
https://developer.apple.com/documentation/foundation/userdefaults/