โ Property Wrapper
ํ๋กํผํฐ๋ฅผ ๊ฐ์ธ ํน๋ณํ ํ์ ์ผ๋ก ๋ง๋ค์ด์ค๋ค.
๊ฐ๋จํ ๋งํด๋ณด๋ฉด, ์ด๋ค ๋ก์ง๋ค์ ๋งค๋ฒ ๋์ผํ๊ฒ ์ง์ ํด์ฃผ์ง ์๊ณ Property Wrapper๋ก ๋ง๋ ํ์ ์ผ๋ก ํ๋กํผํฐ๋ฅผ ์ ์ธํด ๋์ผ ๋ก์ง์ ์ํํ๋๋ก ํ๋ค.
โ Property Wrapper๊ฐ ์๋ค๋ฉด ?
struct House {
private var width = 0
var size: Int {
get { return width }
set { width = pow(newValue, 20) }
}
}
struct KoreaHouse {
private var _appartment = House()
private var _villa = House()
var appartmentSize: Int {
get { return _appartment.size }
set { _appartment.size = newValue }
}
var villaSize: Int {
get { return _villa.size }
set { _villa.size = newValue}
}
}
๋ง์ฝ ์ง์ Size ์ ๋ณด๋ฅผ ๊ฐ์ง๋ House ํ์ ์ด ์๋ค.
์ด๋ ๊ฒ ์ ์ํด์ค ํ์ ์ KoreaHouse ๊ตฌ์กฐ์ฒด ๋ด์์ ๊ฐ ํ๋กํผํฐ์์ ๋งค๋ฒ ๋์ผํ ๋ณด์ผ๋ฌ ํ๋ ์ดํธ ์ฝ๋๋ฅผ ์์ฑํด์ผ ํ๋ค.
ํ์ง๋ง ์ฝ๋๊ฐ ๊ด๋ฒ์ํ๊ฒ ๋ง์์ง๋ฉด ๋๋ฌด ๋ณต์กํด์ง๋ค.
์ด๋ฐ ์ค๋ณต๋๋ ๋ก์ง๋ค์ Property Wrapper๋ฅผ ๋ถ์ฌ ํ ๋ฒ๋ง ์ ์ํด์ฃผ๋ฉด ์ดํ ๋ค๋ฅธ ํ๋กํผํฐ๋ค์์ ํด๋น Property Wrapper๋ฅผ ์ ์ฉํ๋ฉด ๊น๋ํ๊ฒ ์ฝ๋๋ฅผ ์ฌ์ฌ์ฉ ํ ์ ์๋ค.
โ Property Wrapper ์ ์
Property Wrapper๋ ํ๋กํผํฐ๋ฅผ ๊ฐ์ง๋ ํ์ ์์ ๋ถ์ฌ์ค๋ค.
ํ๋กํผํฐ๋ฅผ ๊ฐ์ง๋ ํ์ ์ด๋ผํจ์ Class, Struct, Enum์ด ๋ ๊ฒ์ด๋ค.
@propertyWrapper
struct House {
private var width = 0
var size: Int{
get { return width }
set { width = pow(newValue,2) }
}
}
์ด๋ ๊ฒ ๋ถ์ฌ์ฃผ๋ฉด ๋์ด๋ค.
๋ฌผ๋ก ํ์ ์ด๊ธฐ์ ์ด๊ธฐ๊ฐ์ ์ง์ ํด์ค ์๋ ์๋ค.
@propertyWrapper
struct House{
private var width = 0
var size: Int {
get { return width }
set { width = pow(newValue, 2) }
}
init(size: Int) {
width = pow(newValue, 2)
}
}
์ด๋ ๊ฒ ๋ง์ด๋ค.
๊ทธ๋ผ ์ด์ Property Wrapper๊ฐ ์ค์ ๋ก ์ด๋ป๊ฒ ์ฐ์ผ๊น ?
โ Property Wrapper ์ฌ์ฉํ๊ธฐ
struct KoreaHouse {
@House var apartment: Int
@House var villa: Int
}
var koreaHouse = KoreaHouse()
koreaHouse.apartment = 20
koreaHouse.villa = 30
print(koreaHouse.apartment, koreaHouse.villa) // 400, 900
KoreaHouse ํ์ ์ ๋ง๋๋๋ฐ ์์ฃผ ๊ฐ๋จํด์ก๋ค.
๋ง์ฝ ์์ propertyWrapper ๊ตฌํ ์ ์ด๋์ ๋ผ์ด์ ๋ฅผ ์ง์ ํด์ฃผ์๋ค๋ฉด ์ฌ๊ธฐ์์๋ ์ด๊ธฐ๊ฐ์ ์ง์ ํด์ค ์ ์๋ค.
struct KoreaHouse {
@House var apartment: Int = 20
@House var villa: Int = 30
}
var koreaHouse = KoreaHouse()
print(koreaHouse.apatment, koreaHouse.villa) // 400, 900
๋ ๊ฐ๋จํ๊ฒ ์ฌ์ฉํ ์๋ ์๋ค.
์ค์ํ ์ ์ ๋ณด์ผ๋ฌ ์ฝ๋๊ฐ ์ ๊ฑฐ๋๊ณ ์ฌ์ฉ์ฑ์ด ์ฆ๊ฐํ๋ค๋ ๊ฒ์ด๋ค.
๐ก @State๋ ๋ฏ์ด๋ณด์
SwiftUI์์ State ํ์ ์ ๊น๋ณด๋ฉด ์๋์ ๊ฐ์ด @propertyWrapper ๋ฑ์ง๊ฐ ๋ถ์ด์๋ค๋ ๊ฒ์ ์ ์ ์๋ค.
์ฆ ์ด ์น๊ตฌ๋ ์ค๋ณต ๋ก์ง ์ฝ๋๋ฅผ propertyWrapper๋ก ์ ๋ฆฌํ๋ค๋ ๊ฒ์ด๋ค.
@State์ ์ ์๋ฅผ ๋ค์ด๊ฐ์ ์ฃผ์์ ์ ๊ฑฐํ๋ฉด ์ด๋ ๊ฒ ๊ตฌํ๋์ด์๋ค.
@frozen @propertyWrapper public struct State<Value> : DynamicProperty {
public init(wrappedValue value: Value)
public init(initialValue value: Value)
public var wrappedValue: Value { get nonmutating set }
public var projectedValue: Binding<Value> { get }
}
'๐ iOS > SwiftUI' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[SwiftUI] TextEditor BackgroundColor ์ ์ฉ (0) | 2024.04.22 |
---|---|
[SwiftUI] NavigationStack (0) | 2024.04.04 |
[SwiftUI] ํ๋กํผํฐ๋ํผ ์ ๋ฆฌ (0) | 2024.03.17 |
[iOS][SwiftUI] @State @Binding (1) | 2024.01.07 |
[iOS][SwiftUI] Save Color in UserDefaults (0) | 2024.01.01 |