Deep_Dev

 

โœ… 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