๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐ŸŽ iOS/SwiftUI

[SwiftUI] @State๋ž€?

by Fomagran ๐Ÿ’ป 2021. 11. 7.
728x90
๋ฐ˜์‘ํ˜•

 


์•ˆ๋…•ํ•˜์„ธ์š” Foma ๐Ÿ’ป ์ž…๋‹ˆ๋‹ค!

์š”์ฆ˜ SwiftUI ๊ณต๋ถ€๋ฅผ ํ•˜๊ณ  ์žˆ๋Š”๋ฐ @State๊ฐ€ ๋งŽ์ด ์“ฐ์ด๊ธด ํ•˜๋Š”๋ฐ ๋ญ”์ง€ ์ •ํ™•ํžˆ๋Š” ๋ชจ๋ฅด๊ฒ ๋”๋ผ๊ตฌ์š”.

๊ทธ๋ž˜์„œ @State์— ๋Œ€ํ•ด์„œ ์ •ํ™•ํžˆ ์ •๋ฆฌํ•ด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค!

๋ฐ”๋กœ ์‹œ์ž‘ํ• ๊ฒŒ์š”~


@State ๋ž€?


์• ํ”Œ ๊ณต์‹ ๋ฌธ์„œ์—๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

 


ํ•ด์„ํ•ด๋ณด๋ฉด SwiftUI์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ๊ฐ’์„ ์ฝ๊ณ  ์“ธ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ํ•˜๋„ค์š”.

๊ฐœ์š”๋ฅผ ์‚ดํŽด๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 


1. ์ƒํƒœ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ฉด View๋ฅผ ๋‹ค์‹œ ๊ณ„์‚ฐํ•˜๊ณ  ์—…๋ฐ์ดํŠธ ํ•ฉ๋‹ˆ๋‹ค.

2. ์ธ์Šคํ„ด์Šค ๊ฐ’์ด ์•„๋‹ˆ๋ผ ๊ฐ’์„ ์ฝ๊ณ  ์“ฐ๋Š” ์ˆ˜๋‹จ์ž…๋‹ˆ๋‹ค.

3. ์ฃผ์˜ํ•  ์ ์€ ๋ทฐ์˜ ๋ฐ”๋”” ์•ˆ์—์„œ ๋˜๋Š” ๋ทฐ์—์„œ ํ˜ธ์ถœํ•œ ๋ฉ”์†Œ๋“œ์—์„œ๋งŒ ์ ‘๊ทผํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๋ทฐ์˜ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ ‘๊ทผํ•˜์ง€ ๋ชปํ•˜๋„๋กprivate๋กœ ์„ ์–ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

4. ์‚ฌ์šฉํ•  ๋•Œ๋Š” $์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.


๊ตฌํ˜„


์ด์ œ ์ด๋ก ์„ ์‚ดํŽด๋ดค๊ณ  ์ง์ ‘ ๊ตฌํ˜„ํ•ด ๋ด์•ผ๊ฒ ์ฃ ?

๋‹ค์Œ๊ณผ ๊ฐ™์ด @State๋กœ ๊ฐ€๋Šฅํ•œ์ง€ ์—ฌ๋ถ€๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋Š” isEnabled ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค.

 

 @State private var isEnabled:Bool = false


๋ฐ”๋”” ์•ˆ์€ ์•„๋ž˜์™€ ๊ฐ™์ด ํ…์ŠคํŠธ์™€ ๋ฒ„ํŠผ์ด ์žˆ๊ณ  ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ ๊ฐ€๋Šฅ,๋ถˆ๊ฐ€๋Šฅ ์—ฌ๋ถ€๋ฅผ ๋ฐ”๊พธ๊ณ 

ํ…์ŠคํŠธ์— ๋„์›Œ์ฃผ๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค.

 

 var body: some View {
            VStack(alignment: .center, spacing:60) {
                Text(isEnabled ? "๊ฐ€๋Šฅ" : "๋ถˆ๊ฐ€๋Šฅ")
                Button {
                    isEnabled.toggle()
                }
            label: {
                Text(isEnabled ? "๋ถˆ๊ฐ€๋Šฅ":"๊ฐ€๋Šฅ")
            }
            }
        }


์‹คํ–‰ํ•ด๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด isEnabled ๊ฐ€ ๋ฐ”๋€Œ๊ณ  ๋ฒ„ํŠผ๊ณผ ํ…์ŠคํŠธ์˜ ๊ธ€์”จ๊ฐ€ isEnabled์˜ ๊ฐ’์— ๋”ฐ๋ผ ๋ฐ”๋€Œ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 


์—ฌ๊ธฐ์„œ ์ €๋Š” ์˜๋ฌธ์ ์ด ๋“ค์—ˆ๋Š”๋ฐ์š”.

 

"์•„๋‹ˆ ๊ทธ๋ƒฅ @State ์•ˆ์“ฐ๊ณ  ๋ณ€์ˆ˜๋กœ ์„ ์–ธํ•ด์„œ ์“ฐ๋ฉด ๋˜๋Š”๊ฑฐ ์•„๋‹Œ๊ฐ€? ๐Ÿค”"

 


์•„๋ž˜์™€ ๊ฐ™์ด isEnabled๋ฅผ ๊ทธ๋ƒฅ ๋ณ€์ˆ˜๋กœ ์„ ์–ธํ–ˆ์Šต๋‹ˆ๋‹ค.

 

 var isEnabled:Bool = false


๊ทธ๋žฌ๋”๋‹ˆ ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ๋ฐ”๊พธ๋Š” ๋ถ€๋ถ„์—์„œ "Cannot use mutating member on immutable value: 'self' is immutable" ๋ผ๋Š” ์˜ค๋ฅ˜๊ฐ€

๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

 


ํ•ด์„ํ•ด๋ณด๋‹ˆ "self๋Š” ๋ณ€ํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ง€๊ธˆ ์ด ๋ณ€ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉค๋ฒ„๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์–ด!" ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

Swift๋Š” mutating์œผ๋กœ ์„ ์–ธ๋˜์ง€ ์•Š์€ ์—ฐ์‚ฐ ํ”„๋กœํผํ‹ฐ ๊ตฌ์กฐ์ฒด ๋‚ด๋ถ€์—์„œ ๊ฐ’ ๋ณ€๊ฒฝ์ด ๋ถˆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

 

"๊ทธ๋Ÿฌ๋ฉด mutating์œผ๋กœ ์„ ์–ธํ•˜๋ฉด ๋˜๋Š”๊ฑฐ ์•„๋‹Œ๊ฐ€? ๐Ÿค”"

 


์—ฌ๊ธฐ์„œ self๋Š” View ํ”„๋กœํ† ์ฝœ์„ ์ฑ„ํƒํ•œ ContentView์ฃ ?

View์˜ ๋‚ด๋ถ€๋ฅผ ์‚ดํŽด๋ณด๋ฉด body๊ฐ€ { get } ์œผ๋กœ ๋˜์–ด์žˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

public protocol View {
    associatedtype Body : View
    @ViewBuilder var body: Self.Body { get }
}


์ฆ‰, mutating์œผ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ณ ๋กœ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•ด์„  @State๋ฅผ ์ด์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

"$๋Š” ์–ธ์ œ ์“ฐ๋Š”๊ฑฐ์•ผ? ๐Ÿค”"

 

$๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด Binding์„ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” View๋“ค๊ณผ ๋ฐ”์ธ๋”ฉ ํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

์—ฌ๊ธฐ์„œ ๋ฐ”์ธ๋”ฉ์€ @State ๊ทธ ์ž์ฒด๊ฐ€ ์ฝ์„ ์ˆ˜๋„ ์žˆ๊ณ  ์“ธ ์ˆ˜๋„ ์žˆ๊ฒŒ๋” ํ•˜๋Š” ๊ฒƒ์ธ๋ฐ์š”.

 

์œ„์—์„œ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด isEnabled๋ฅผ toggleํ•˜์—ฌ ์ƒํƒœ๋ฅผ ๋ฐ”๊ฟ”์ฃผ๊ณ  Text๋ฅผ ์ƒํƒœ๊ฐ’์— ๋”ฐ๋ผ ๋ฐ”๊ฟ”์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

 

์ด์ œ $์„ ์‚ฌ์šฉํ•ด์„œ ์•„๋ž˜์™€ ๊ฐ™์ด Toggle๊ณผ ๋ฐ”์ธ๋”ฉ ์‹œ์ผœ์ฃผ๊ฒ ์Šต๋‹ˆ๋‹ค.

 

	Toggle(isOn:$isEnabled) {
            Text(isEnabled ? "๊ฐ€๋Šฅ" : "๋ถˆ๊ฐ€๋Šฅ")
        }

 

ํ† ๊ธ€๊ฐ’๊ณผ isEnabled๊ฐ€ ๋ฐ”์ธ๋”ฉ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ํ† ๊ธ€๊ฐ’์— ๋”ฐ๋ผ ํ…์ŠคํŠธ๊ฐ€ ๋ฐ”๋€Œ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

 

 


Reference

 

 

Apple Developer Documentation

developer.apple.com

 

728x90
๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€