์ด๋ชจ์ €๋ชจ/Swift

Property Wrapper With Keypath

ARpple 2023. 8. 21. 20:11
๐Ÿ’ก ์œ ์ € ๋””ํดํŠธ์— ํŠน์ • ํ‚ค(String ๊ฐ’)์— ์•ˆ์ „ํ•˜๊ณ  ๊ฐ„๋‹จํ•˜๊ฒŒ ์ ‘๊ทผํ•˜๋Š” ๊ณ„์‚ฐ ํ”„๋กœํผํ‹ฐ๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค.
- ํ•˜์ง€๋งŒ ์ด๋Š” `UserDefault.standard.๊ณ„์‚ฐํ”„๋กœํผํ‹ฐ = ๋ฐ”๋€” ๊ฐ’` ํ˜•์‹์œผ๋กœ ์—ฌ์ „ํžˆ ์ฝ”๋“œ๊ฐ€ ๊ธธ์—ˆ๋‹ค.
- ์ด๋ฅผ ๋” ํŽธ๋ฆฌํ•˜๊ณ  ๊ฐ„๋‹จํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ Property Wrapper๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค.

ํ”„๋กœํผํ‹ฐ ์‚ฌ์šฉ ๊ตฌ์กฐ

SwiftUI Environment์™€ ๋น„์Šทํ•˜๊ฒŒ UserDefaults์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๋ชฉ์ 

Environment ํ”„๋กœํผํ‹ฐ ์‚ฌ์šฉ๋ฒ•

@Environment(\.layoutDirection) var layoutDirection

Environment | Apple Developer Documentation

 

Environment | Apple Developer Documentation

A property wrapper that reads a value from a view’s environment.

developer.apple.com

๋ชฉํ‘œ ์‚ฌ์šฉ๋ฒ•

@DefaultsState(\.๊ณ„์‚ฐ_ํ”„๋กœํผํ‹ฐ) var ๋ณ€์ˆ˜

๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด ๋†“์„ ๊ณ„์‚ฐ ํ”„๋กœํผํ‹ฐ:

extension UserDefaults{
    var ๊ณ„์‚ฐ_ํ”„๋กœํผํ‹ฐ:ํƒ€์ž…{
        get{ self.ํƒ€์ž…์— ๋งž๋Š” ๋ณ€ํ™˜(forKey: "ํ‚ค ๋ฌธ์ž์—ด") }
        set{
            self.set(newValue,forKey: "ํ‚ค ๋ฌธ์ž์—ด")
        }
    }
}

ํ”„๋กœํผํ‹ฐ ๋ž˜ํผ ์ œ์ž‘

์ „์ฒด ์˜ˆ์ œ ์ฝ”๋“œ

import Foundation
extension UserDefaults{
    var hello:Int{
        get{ self.integer(forKey: "hello") }
        set{self.set(newValue,forKey: "hello")}
    }
}
UserDefaults.standard.hello = 10
@propertyWrapper
struct DefaultsState<Value>{
    private var path: ReferenceWritableKeyPath<UserDefaults,Value>
    var wrappedValue: Value{
        get{
            UserDefaults.standard[keyPath: path]
        }
        set{
            UserDefaults.standard[keyPath: path] = newValue  
        }
    }
    init(_ location:ReferenceWritableKeyPath<UserDefaults,Value>){
        self.path = location
    }
}
struct Hello{
    @DefaultsState(\.hello) var wow
}
var h = Hello()
print(h.wow)
h.wow = 20
print(h.wow)
  • ํ”„๋กœํผํ‹ฐ ๋ž˜ํผ ๊ตฌ์กฐ์ฒด์— Value๋ผ๋Š” ์ž„์‹œ ํƒ€์ž…์„ KeyPath์˜ ์ตœ์ข… ๋ชฉ์  ํƒ€์ž…๊ณผ ๋งž์ถ”์–ด ๊ตฌ์กฐ์ฒด ์ „์ฒด(ํŠนํžˆ, wrappedValue)์— ํƒ€์ž… ์ถ”๋ก ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ํƒ€์ž… ์ถ”๋ก  ์‹คํŒจ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • KeyPath๋ณ€์ˆ˜๋Š” ReferenceWritableKeyPath๋กœ ํƒ€์ž…์„ ์„ค์ •ํ•ด์•ผํ•œ๋‹ค.
    ๊ณ„์‚ฐ ์†์„ฑ์— ์ ‘๊ทผํ•˜๊ธฐ ๋•Œ๋ฌธ์— UserDefaults.standard[keyPath: path] ์—์„œ path๊ฐ€ ์ฐธ์กฐ ํ˜•์‹์ด ์•„๋‹ˆ๋ฉด UserDefaults์—์„œ ์ •์˜ํ•œ ๊ณ„์‚ฐ ์†์„ฑ์˜ get์— ์ ‘๊ทผํ•ด ์ƒˆ๋กœ์šด ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.