아리의 iOS 탐구생활

[iOS/Swift] 라이브러리 SwiftyUserDefaults를 알아보자~ 본문

Swift/iOS

[iOS/Swift] 라이브러리 SwiftyUserDefaults를 알아보자~

Ari Lee 2024. 1. 3. 23:53
반응형
 

GitHub - sunshinejr/SwiftyUserDefaults: Modern Swift API for NSUserDefaults

Modern Swift API for NSUserDefaults. Contribute to sunshinejr/SwiftyUserDefaults development by creating an account on GitHub.

github.com

 

SwiftyUserDefaults는 한 곳에서 키를 정의하고, 값 유형을 쉽게 사용할 수 있으며, 컴파일 시 안전성과 편의성을 높여주는 컴파일 타임 검사를 무료로 이용할 수 있다고 한다.

 

한마디로 UserDefaults를 사용할 때, 타입 안전성과 코드의 간결성을 동시에 얻을 수 있는 아주 편리한 라이브러리다.

 

 

Generic, Subscript, DynamicMemberLookup 등을 활용하여
UserDefaults를 아주 편안하게 사용할 수 있게 구현되어 있다.

 

 

💾 SwiftyUserDefaults로 특정 값을 접근하거나 저장하기

1. 키 정의하기

정의하는 방법은 DefaultsKey라는 제네릭 타입을 활용하여 정의해준다. 이때 들어가는 타입은 저장될 타입을 의미한다.
타입을 옵셔널로 설정하지 않을경우 defaultValue를 꼭 설정해 줘야 한다.

let username: DefaultsKey<String?> = .init("username")
let launchCount: DefaultsKey<Int> = .init("launchCount", defaultValue: 0)

 

 

더 편리하게 사용하려면 아래 코드 예시와 같이 DefaultsKeys 타입을 확장하여 프로퍼티를 정의해주면 된다.

extension DefaultsKeys {
    var username: DefaultsKey<String?> { .init("username") }
    var launchCount: DefaultsKey<Int> { .init("launchCount", defaultValue: 0) }
}

 

왜 위 방법이 편리한지는 아래를 살펴보면 이해할 수 있다. 😄

 

 

2. 접근하기

DefaultsKeys를 확장하여 정의한 프로퍼티를 활용할 때
// UserDefaults 값을 손쉽게 가져와 바로 할당할 수 있다.
let username: String? = Defaults.username

 

DefaultsKey를 직접 사용할 때
let username: DefaultsKey<String?> = .init("username")
let username: String? = Defaults[key: username]

 

 

3. 저장하기

DefaultsKeys를 확장하여 정의한 프로퍼티를 활용할 때
// 값을 제자리에서 수정할 수 있다.
Defaults.launchCount += 1

 

DefaultsKey를 직접 사용할 때
let launchCount: DefaultsKey<Int> = .init("launchCount", defaultValue: 0)
Defaults[key: launchCount] += 1

 

 

🔎 Defaults는 어떻게 정의되어있을까?

전역적으로 사용되는 Defaults는 어떻게 구현되어있는지 살펴보니 아래와 같이 정의되어있었다.

public var Defaults = DefaultsAdapter<DefaultsKeys>(defaults: .standard, keyStore: .init())

 

DefaultsAdapter는 UserDefaults를 래핑한 구조체이다.

 

defaults는 UserDefaults를 의미하고, KeyStore는 DefaultsKeyStore 프로토콜을 준수한 타입을 의미한다.
기본적으로는 빈 구조체로 DefaultsKeys라는 구조체가 정의되어있었다.

 

 

 

이렇게 SwiftyUserDefaults라는 라이브러리를 간단하게 살펴보았는데,
추가로 KVO 기능을 제공하기도 하며,
프로퍼티 래퍼를 활용하여 각 Key 값에 캐싱 및 관찰 옵션을 설정할 수도 있다.
자세한 건 아래 링크를 참고해 보자.

https://github.com/sunshinejr/SwiftyUserDefaults#property-wrappers

 

 

 

🍯 꿀팁: UserDefaults에 저장되어있는 모든 Key-Value 쌍을 가져오기

 

dictionaryRepresentation() | Apple Developer Documentation

Returns a dictionary that contains a union of all key-value pairs in the domains in the search list.

developer.apple.com

 

dictionaryRepresentation() 메소드를 활용하여 UserDefaults에 저장된 모든 Key와 Value를 딕셔너리 형태로 가져올 수 있다.

아래는 활용 예시!

 

func removeAll() {
    for key in defaults.dictionaryRepresentation().keys {
        defaults.removeObject(forKey: key)
    }
}

 

 

 

 

 

 

제 글에 틀린 내용이 있거나 혹은 도움이 되셨다면,  공감💛 ㆍ 구독✅ ㆍ 공유🔗 ㆍ댓글✍🏻  부탁드립니다. 🙏🏻
 
 
 
 
반응형
Comments