SwiftUI를 쓰다 보면 @State를 변수 선언할 때 자주 쓰게 된다. 그렇다면 이 @State는 뭘까? 결론부터 이야기하자면 Property wrapper라고 한다. 속성을 감싼다고? 이게 무슨 뜻이지 또?
Property wrapper?
@State var number: Int = 0
SwiftUI에서는 변수를 선언할 때 아래와 같이 선언을 하게 된다. number는 var
키워드를 사용하여 변수(variable)로 선언되었고, Int
데이터 타입(data type)을 가지며, 초기값으로 0을 가진다. 그리고 @State
는 number
라는 속성(property)을 상태(State)로 감싸(wrapping) 준다.
Swift에서 속성(property)은 클래스(class), 구조체(struct), 열거형(enum) 등의 타입 내부에 선언된 변수(variable) 또는 상수(constant)를 의미한다.
왜 감싸는 건데?
해당 속성을 상태 속성으로 만들어서 변경가능하게 만들어준다. 그리고 변경 사항을 추적하고, 변경을 감지하면 자동으로 View를 업데이트하기 위함이다. 코드로 예시를 들어보자. 아래와 같은 코드가 있다. number
의 초기값을 0
으로 설정하고 +
버튼을 누르면 1을 더하고, -
버튼을 누르면 1을 뺀다.
import SwiftUI
struct MyView: View {
@State var number: Int = 0
var body: some View {
VStack {
Text("number : \(number)")
HStack {
Button("+") {
number += 1
}
.buttonStyle(.borderedProminent)
Button("-") {
number -= 1
}
.buttonStyle(.bordered)
}
}
}
}
그렇다면 여기서 number의 값이 변경되면 보이는 뷰가 달라지는 것일까? 그렇다!! @State
가 알아서 해준다.
@State를 쓰지 않고 var number: Int = 0 로 선언해 준다면?
Left side of mutating operator isn't mutable: 'self' is immutable 라는 에러문구를 볼 수 있다. 해석해 보면 값을 변경할 수 없다는 것인데 이것은 구조체와 또 관련이 있다. 나중에 다루겠지만 구조체 안에 있는 값은 불변(immutable)하다. 그렇기 때문에 @State
로 감싸(wrapping) 주어 속성(property) 값을 변경 가능하게 해주는 것이다. 그리고 View 업데이트도 해주게 된다.
SwiftUI에서는 @Binding
, @ObservableObject
, @Published
등의 다양한 Property wrapper가 있다. 하나하나 알아보도록 하자.
결론
@State 는 값이 변경될 때, 자동으로 뷰를 업데이트 해준다.
'SwiftUI > SwiftUI 문법' 카테고리의 다른 글
[SwiftUI] @EnvironmentObject 알아보기 (0) | 2023.05.20 |
---|---|
[SwiftUI] @StateObject 알아보기 (0) | 2023.05.20 |
[SwiftUI] @Published, @ObservedObject 알아보기 (0) | 2023.05.20 |
[SwiftUI] @Binding 알아보기 (0) | 2023.05.20 |
[SwiftUI] SwiftUI 기본 구성 ContentView (0) | 2023.04.26 |