iOS/SwiftUI

[SwiftUI] Property Wrapper @

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로 해당 객체에 접근할 수 있습니다.

[참고]

https://developer.apple.com/documentation/swiftui/state

https://zeddios.tistory.com/964

728x90

'iOS > SwiftUI' 카테고리의 다른 글

[Combine] 01_Hello, Combine!  (0) 2023.06.13
[SwiftUI] Stack, LazyStack, Grid, List, Form  (0) 2023.06.13