ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

์•ˆ๋…•ํ•˜์„ธ์š”?

๋„ˆ๊ตฌ๋ฆฌ์ž…๋‹ˆ๋‹คใ…Žใ…Ž

 

์˜ค๋Š˜์€ ํ”„๋กœํผํ‹ฐ ๋ž˜ํผ์— ๋Œ€ํ•ด์„œ ๊ณต๋ถ€ํ•ด๋ณด๋ ค๊ณ  ํ•˜๋Š”๋ฐ์š”.

์š”์ฆ˜ SwiftUI๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ

@State๋‚˜ @Binding ๊ฐ™์€ ์นœ๊ตฌ๋“ค์„ ๋งŽ์ด ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”๋ฐ

์ด ์นœ๊ตฌ๋“ค ์ด๋ฆ„์ด ํ”„๋กœํผํ‹ฐ ๋ž˜ํผ์—ฌ์„œ ๋‚ด์šฉ์„ ๊ณต๋ถ€ํ•˜๋ฉด์„œ ์ •๋ฆฌํ•ด๋ณด๋ ค ํ•ฉ๋‹ˆ๋‹ค.

 

๊ทธ๋Ÿผ ๋ฐ”๋กœ ์‹œ์ž‘ํ•ด๋ณผ๊ฒŒ์š”!!

 

ํ”„๋กœํผํ‹ฐ ๋ž˜ํผ(Property Wrapper)๋ž€?


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

์ง๊ด€์ ์œผ๋กœ ๋ณด๋ฉด ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ์‹ธ์„œ ์‚ฌ์šฉํ•˜๋Š” ๋А๋‚Œ์ด๋„ค์š”

(๊ฐ์‹ธ์„œ ๋ญ˜ ํ•˜๊ฒ ๋‹ค๋Š”๊ฑฐ์ง€...?)

 

๊ณต์‹๋ฌธ์„œ์—์„œ ๋‚˜์˜ค๋Š” ๋‚ด์šฉ์„ ๋ณด๋ฉด 

ํ”„๋กœํผํ‹ฐ๊ฐ€ ์ €์žฅ๋˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ด€๋ฆฌํ•˜๋Š” ์ฝ”๋“œ์™€ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ •์˜ํ•˜๋Š” ์ฝ”๋“œ ์‚ฌ์ด์— ๋ถ„๋ฆฌ๊ณ„์ธต์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์ด๊ฒƒ์„ ์žฌ์‚ฌ์šฉํ•œ๋‹ค.

๋ผ๊ณ  ๋‚˜์˜ค๋Š”๋ฐ

์Œ... ๊ฐ์ด ์ž˜ ์•ˆ์˜ค๋„ค์š”..

 

์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด๋ฉด์„œ ๋” ์•Œ์•„๋ณด๋„๋ก ํ• ๊ฒŒ์š”!

๋จผ์ € ํ”„๋กœํผํ‹ฐ ๋ž˜ํผ๋ฅผ ์ •์˜ํ•ด๋ณผ๊ฒŒ์š”!!

 

ํ”„๋Ÿฌํผํ‹ฐ ๋ž˜ํผ๋ฅผ ์ •์˜ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” wrappedValue ํ”„๋กœํผํ‹ฐ๋ฅผ ์ •์˜ํ•œ

๊ตฌ์กฐ์ฒด, ์—ด๊ฑฐํ˜•์ด๋‚˜ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

์Œ ๊ทธ๋Ÿผ ํ•ญ์ƒ 12์ดํ•˜์ธ ์ˆ˜๋ฅผ ์ €์žฅํ•˜๋Š” ํ”„๋กœํผํ‹ฐ ๋ž˜ํผ๋ฅผ ์„ ์–ธํ•ด๋ณผ๊ฒŒ์š”!

@propertyWrapper
struct TwelveOrLess {
    private var number = 0
    var wrappedValue: Int {
        get { return number }
        set { number = min(newValue, 12) }
    }
}

๋จผ์ € @propertyWrapper ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์„ ์–ธํ•˜๊ณ ์ž ํ•˜๋Š” ๊ตฌ์กฐ์ฒด ์•ž์— ๋ถ™์—ฌ์ค๋‹ˆ๋‹ค.

์ดํ›„์— wrappedValue ํ”„๋กœํผํ‹ฐ๋ฅผ ์ •์˜ํ•˜๊ณ  ์›ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๋ฆฌํ„ดํ•˜๋„๋ก  ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด ์ฃผ๋Š”๊ฑฐ์—์š”!

์ด๋•Œ number๋ฅผ private๋กœ ์„ ์–ธํ•ด์„œ ๋‚ด๋ถ€์—์„œ๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค๋‹ˆ๋‹ค.

 

 

๊ทธ๋ฆฌ๊ณ  ์ •์˜ํ•œ ํ”„๋กœํผํ‹ฐ ๋ž˜ํผ๋ฅผ ์‚ฌ์šฉํ•ด ๋ณผ๊ฒŒ์š”!

struct SmallRectangle {
    @TwelveOrLess var height: Int
    @TwelveOrLess var width: Int
}

var rectangle = SmallRectangle()
print(rectangle.height)
// Prints "0"

rectangle.height = 10
print(rectangle.height)
// Prints "10"

rectangle.height = 24
print(rectangle.height)
// Prints "12"

์œ„์—์„œ ๋งŒ๋“ค์—ˆ๋˜ ํ”„๋กœํผํ‹ฐ ๋ž˜ํผ๋ฅผ ์‚ฌ์šฉํ•ด์„œ

์ง์‚ฌ๊ฐํ˜•์˜ ๊ฐ€๋กœ ์„ธ๋กœ ๊ธธ์ด๋ฅผ ํ”„๋กœํผํ‹ฐ๋กœ ๊ฐ€์ง€๋Š” ๊ตฌ์กฐ์ฒด๋ฅผ ๋งŒ๋“ค์—ˆ๋Š”๋ฐ์š”.

 

์•„๋ž˜์— ์ธ์Šคํ„ด์Šค์˜ height๊ฐ’์„ ํ™•์ธํ•ด ๋ณด๋ฉด

์ดˆ๊ธฐ๊ฐ’์„ ์ถœ๋ ฅํ•˜๋ฉด ํ”„๋กœํผํ‹ฐ ๋ž˜ํผ์˜ ์ดˆ๊ธฐ๊ฐ’์ด ์ถœ๋ ฅ๋˜๊ณ ,

์ดํ›„์— ์—ฌ๋Ÿฌ ๊ฐ’์„ ์ž…๋ ฅํ•ด ์ฃผ์—ˆ์„ ๋•Œ

ํ”„๋กœํผํ‹ฐ ๋ž˜ํผ์˜ setter์—์„œ ์„ค์ •ํ•œ ๊ฐ’์„ ์ถœ๋ ฅํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์–ด์š”!!

์‹ ๊ธฐํ•˜๋„ค์š”ใ…Žใ…Ž

 

ํ”„๋กœํผํ‹ฐ์— ๋ž˜ํผ๋ฅผ ์ ์šฉํ•  ๋•Œ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€

๋ž˜ํผ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ์ €์žฅ์†Œ ์ฝ”๋“œ์™€ ํ”„๋กœํผํ‹ฐ์— ์ ‘๊ทผํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ํ•ฉ์„ฑํ•œ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ด๋Ÿฐ ๊ณผ์ •์ด ๊ฐ€๋Šฅํ•œ๊ฐ€๋ด์š”!

 

๋˜ ํ”„๋กœํผํ‹ฐ ๋ž˜ํผ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋”๋ผ๋„ 

๋˜‘๊ฐ™์ด ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ์š”!

 

๋ฐ”๋กœ ํ”„๋กœํผํ‹ฐ ๋ž˜ํผ๋กœ ์„ ์–ธํ•œ ๊ตฌ์กฐ์ฒด๋ฅผ ํ”„๋กœํผํ‹ฐ๋กœ ๋งŒ๋“ค์–ด์ฃผ๋Š”๊ฑฐ์—์š”!!

๊ทธ๋ ‡๊ฒŒ ์ž‘์„ฑ๋œ ์ฝ”๋“œ๋ฅผ ๋ณด์‹ค๊นŒ์š”?

struct SmallRectangle {
    private var _height = TwelveOrLess()
    private var _width = TwelveOrLess()
    var height: Int {
        get { return _height.wrappedValue }
        set { _height.wrappedValue = newValue }
    }
    var width: Int {
        get { return _width.wrappedValue }
        set { _width.wrappedValue = newValue }
    }
}

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์›๋ž˜ ๊ธฐ๋Šฅ๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค!!

height์™€ width์˜ get๊ณผ set์€ _height์™€ _width์˜ wrappedValue์— ์ ‘๊ทผํ•˜์—ฌ

๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

์ €๋Š” ๋ญ”๊ฐ€ ํ”„๋กœํผํ‹ฐ ๋ž˜ํผ๋กœ ๊ตฌํ˜„ํ•œ๊ฒŒ ๋” ๋Œ๋ฆฌ๋„ค์š”ใ…Žใ…Ž

 

๋˜, ํ”„๋กœํผํ‹ฐ ๋ž˜ํผ๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ ๋‚ด๋ถ€์˜ ํ”„๋กœํผํ‹ฐ๊ฐ€ ์ดˆ๊ธฐํ™”๊ฐ€ ๋˜์–ด ์žˆ์–ด์•ผ ํ•˜๊ณ 

์ด ๋ถ€๋ถ„์€ ์™ธ๋ถ€์—์„œ ๋ฐ”๊ฟ€ ์ˆ˜ ์—†๋Š”๋ฐ์š”!

 

๋งŒ์•ฝ์— ์ดˆ๊ธฐ๊ฐ’์„ ์™ธ๋ถ€์—์„œ ๋ฐ”๊พธ์–ด ์ฃผ๊ณ  ์‹ถ๋‹ค๋ฉด 

init ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์œผ๋‹ˆ ์ฐธ๊ณ ํ•˜์‹œ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

 

ํ”„๋กœํผํ‹ฐ ๋ž˜ํผ์— ๊ฐ’ ํˆฌ์˜


ํ”„๋กœํผํ‹ฐ ๋ž˜ํผ์— ๊ฐ’ ํˆฌ์˜...?

์ž˜ ์ดํ•ด ์•ˆ๋˜์‹œ์ฃ ?

 

์ข€๋” ์‰ฝ๊ฒŒ ์„ค๋ช…ํ•˜๋ฉด ํ”„๋กœํผํ‹ฐ ๋ž˜ํผ์—์„œ

์ถ”๊ฐ€์ ์ธ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ถ”๊ฐ€์ ์ธ ์ถœ๋ ฅ๊ฐ’์„ ์ฃผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

์ด๋•Œ, ์ถ”๊ฐ€์ ์ธ ๊ฐ’์„ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‹ฌ๋Ÿฌ ํ‘œ์‹œ($)๋ฅผ ๋ถ™์—ฌ์•ผ ํ•˜๋Š”๋ฐ์š”.

์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด์„œ ์‚ฌ์šฉ๋ฒ•์„ ์‚ดํŽด ๋ณผ๊ฒŒ์š”.

 

@propertyWrapper
struct SmallNumber {
    private var number: Int
    private(set) var projectedValue: Bool

    var wrappedValue: Int {
        get { return number }
        set {
            if newValue > 12 {
                number = 12
                projectedValue = true
            } else {
                number = newValue
                projectedValue = false
            }
        }
    }

    init() {
        self.number = 0
        self.projectedValue = false
    }
}
struct SomeStructure {
    @SmallNumber var someNumber: Int
}
var someStructure = SomeStructure()

someStructure.someNumber = 4
print(someStructure.$someNumber)
// Prints "false"

print(someStructure.someNumber)
// prints "4"

someStructure.someNumber = 55
print(someStructure.$someNumber)
// Prints "true"

์ถ”๊ฐ€์ ์ธ ๊ธฐ๋Šฅ์€ ๋ฐ”๋กœ 12๋ณด๋‹ค ํฌ๋ฉด true, ์ž‘์œผ๋ฉด false๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ธฐ๋Šฅ์ธ๋ฐ์š”

์ด๊ฒƒ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด 

projectedValue ํ”„๋กœํผํ‹ฐ๋ฅผ ์ถ”๊ฐ€ํ•ด ์ค๋‹ˆ๋‹ค!!

 

์ดํ›„ ๊ฐ’์„ ๊ตฌ๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด get๊ณผ set์—์„œ ๊ธฐ๋Šฅ์„ ์ •๋ฆฌํ•ด ์ฃผ๊ณ 

์™ธ๋ถ€์—์„œ numberํ”„๋กœํผํ‹ฐ์— $๋ฅผ ๋ถ™์—ฌ์„œ ์ ‘๊ทผํ•˜๋ฉด

projectedValue์˜ ๊ฐ’์„ ์ถœ๋ คํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค!!

์‹ ๊ธฐํ•˜๋„ค์š”..ใ…Ž

 

$ ๋กœ ์‹œ์ž‘ํ•˜๋Š” ํ”„๋กœํผํ‹ฐ๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์—

ํˆฌ์˜๋œ ๊ฐ’์€ ์ •์˜ํ•œ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ ˆ๋Œ€ ๋ฐฉํ•ดํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ํ•˜๋„ค์š”..

 

 

 

 

 

 

์˜ค๋Š˜ ๊ณต๋ถ€๋Š” ์•ž์œผ๋กœ๋„ ๊ณ„์† ๋„์›€์ด ๋ ๊ฒƒ๊ฐ™์•„์š”.

์ฝ์œผ์‹  ๋ถ„๋“ค์—๊ฒŒ๋„ ๋„์›€์ด ๋˜์‹œ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹คใ…Žใ…Ž

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹น!!

 

๋Œ“๊ธ€
๊ณต์ง€์‚ฌํ•ญ
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€
Total
Today
Yesterday
๋งํฌ
ยซ   2026/03   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
๊ธ€ ๋ณด๊ด€ํ•จ