iOS/SwiftUI
[SwiftUI] Property Wrapper @
초비
2023. 6. 13. 00:22
728x90
@State
값의 상태를 저장하고 변경을 감지하여 뷰를 다시 렌더링하는 데 사용됩니다.
struct ContentView: View {
@State private var count = 0
var body: some View {
Button(action: {
count += 1
}) {
Text("Count: \\(count)")
}
}
}
- 현재 뷰 UI의 특정 상태를 저장하기 위해 만들어진 것이기 때문에 보통 Private로 지정하여 사용
@Binding
값을 참조하는 데 사용되며, 뷰 간에 데이터를 양방향으로 전달하는 데 유용합니다.
값의 소유권은 다른 뷰가 가지고 있으며 해당 뷰는 변경 사항을 수신할 수 있습니다.
struct DetailView: View {
@Binding var showDetail: Bool
var body: some View {
Button(action: {
showDetail = false
}) {
Text("Dismiss")
}
}
}
- 위의 @State 값을 다른 뷰에서 사용할 때 @Binding을 사용
- @State 로 선언된 속성에 변경이 생기면 @Binding 변수에서 이를 인지하고 해당 값에 따른 뷰 변화를 바로 반영할 수 있도록 하는 방식
- $연산자 사용
- 값을 외부에서 사용하기 때문에 보통 Private를 사용하지 않음
@ObservableObject
관찰 가능한 객체를 사용하여 데이터의 변경 사항을 알릴 수 있도록 합니다.
해당 객체의 속성이 변경될 때마다 뷰는 업데이트됩니다.
class UserData: ObservableObject {
@Published var name = "John Doe"
}
struct ContentView: View {
@ObservedObject var userData = UserData()
var body: some View {
Text("Hello, \\(userData.name)!")
}
}
- @State는 변수와 같은 작은 값을 관찰하며 뷰를 업데이트 했다면, @ObservableObject는 클래스 형태의 조금 더 복잡한 형태의 값을 관찰할 때 사용
- String이나 integer같은 간단한 로컬 프로퍼티대신 외부 참조 타입(external reference type)을 사용한다는 점을 제외하면 @State와 매우 유사
- @ObservedObject와 함께 사용하는 타입은 ObservableObject프로토콜을 따라야함
@Published
@ObservableObject 내의 속성을 변경할 때 자동으로 변경 사항을 게시하는 데 사용됩니다.
- 위의 UserData 클래스에서 name 속성은 @Published로 선언되어 있으므로 변경될 때마다 뷰에 업데이트가 전달됩니다.
@ObservedObject
@ObservableObject로 선언된 객체를 관찰하고 해당 객체가 변경될 때 뷰를 업데이트하는 데 사용됩니다.
- 위의 예제에서 userData는 @ObservedObject로 선언되어 UserData 객체를 관찰하고 변경 사항을 감지합니다.
@EnvironmentObject
전역 환경 객체에 접근하기 위해 사용됩니다.
다른 뷰에서 생성된 데이터를 공유하고 업데이트하는 데 사용됩니다.
- 싱글톤과 비슷한 개념
- 모델이 변경되면 이 EnvironmentObject가 바인딩되고 있는 모든 곳은 view가 자동으로 업데이트
class UserData: ObservableObject {
@Published var name = "John Doe"
}
struct ContentView: View {
@EnvironmentObject var userData: UserData
var body: some View {
Text("Hello, \\(userData.name)!")
}
}
- 위의 코드에서 UserData 객체는 환경 객체로 선언되어 여러 뷰에서 공유됩니다.
- 다른 뷰에서 @EnvironmentObject로 해당 객체에 접근할 수 있습니다.
[참고]
728x90