์๋
ํ์ธ์ 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
๋๊ธ