💡 사용자가 생성한 UserDefaults와 인스턴스를 propertyWrapper로 한 번에 접근하기
사용 예시
struct Hello{
@DefaultsState(path: \.groupShared, \.hello) var groupHello
@DefaultsState(path: \.standard, \.hello) var standardHello
}
대략적인 구조
- 계산 프로퍼티로 접근 가능한 싱글톤 매개체 → UserDefaultsGroup
- UserDefaults에 커스텀 UserDefaults 만들기
- UserDefaults에 사용할 키-값 구성하기
- 프로퍼티 래퍼로 위 UserDefaultsGroup에 존재하는 UserDefaults 접근 후, 해당 UserDefaults 내부의 아이템 접근
1. 계산 프로퍼티로 접근 가능한 싱글톤 매개체
struct UserDefaultsGroup{
static let shared = UserDefaultsGroup()
private init(){}
// UserDefaults.standard는 기본으로 존재함
var standard:UserDefaults{UserDefaults.standard}
var groupShared:UserDefaults{ UserDefaults.groupShared }
}
2. UserDefaults에 커스텀 UserDefaults 만들기
extension UserDefaults{
// 공용 UserDefaults 만들기
static var groupShared: UserDefaults{
let appGroupID = "group.orderbook"
return UserDefaults(suiteName: appGroupID)!
}
}
3. UserDefaults에 사용할 키-값 구성하기
extension UserDefaults{
var hello:Int{
get{ self.integer(forKey: "hello") }
set{self.set(newValue,forKey: "hello")}
}
var Market:String{
get{self.string(forKey: "Market") ?? "No Market"}
set{self.set(newValue,forKey: "Market")}
}
}
4. 프로퍼티 래퍼로 위 UserDefaultsGroup에 존재하는 UserDefaults 접근 후, 해당 UserDefaults 내부의 아이템 접근
@propertyWrapper
struct DefaultsState<Value>{
private var path: KeyPath<UserDefaultsGroup,UserDefaults>
private var item: ReferenceWritableKeyPath<UserDefaults,Value>
var wrappedValue: Value{
get{
UserDefaultsGroup.shared[keyPath: path][keyPath: item]
}
set{
UserDefaultsGroup.shared[keyPath: path][keyPath: item] = newValue
}
}
init(_ item: ReferenceWritableKeyPath<UserDefaults, Value>){
self.init(path: \.standard,item)
}
init(path: KeyPath<UserDefaultsGroup, UserDefaults>,_ item: ReferenceWritableKeyPath<UserDefaults, Value>) {
self.path = path
self.item = item
}
}
전체 코드
UserDefaultsGroup.swift
0.00MB
'이모저모 > Swift' 카테고리의 다른 글
WWDC - Async algorithm 패키지 (0) | 2024.10.20 |
---|---|
Swift - Task.Sleep vs Timer (0) | 2024.04.30 |
ios - 이미지 중복 사용 방지 처리 (0) | 2024.01.25 |
TaskCounter로 병렬 작업 완료 계수 파악하기 (0) | 2023.12.13 |
Property Wrapper With Keypath (0) | 2023.08.21 |
댓글