-
[SwiftUI] #문법 - @ObservedObjectiOS/SWIFTUI 2023. 4. 14. 15:11728x90반응형
오늘은 swiftui에서 사용하는 중요한 프로퍼티 래퍼에 대해 포스팅을 해보겠다.
@ObservedObject
뷰의 변경점이 감지 되면 화면을 업데이트하는 역할을 한다. iOS 14부터 등장한 @StateObject와 매우 흡사한데, 그 차이는 @StateObject를 포스팅할 때 자세히 차이를 설명하겠다.
관찰 가능한 객체를 구독하고 관찰 가능한 객체가 변경될 때마다 보기를 무효화하는 속성 래퍼 유형
개발 문서에 있는 내용을 그대로 직역하면 다음과 같다. 이전의 포스팅한 @State 같은 경우는 한 구조체 안에서 선언하고 다른 뷰와 데이터를 공유할 수 없는 것이 특징이다. 여기서 포인트는 데이터의 변경이 감지 되면 뷰를 새로 그린다는 것이다. 자세히 알아보자
일단 @ObservedObject를 사용하기 위한 조건은 다음과 같다.
- ObservableObject프로토콜을 준수하는 객체를 사용
- ObservableObject의 데이터가 변경되었을을 알리는 방법은 Published 사용
MVVM패턴으로 프로젝트를 진행하게 되면 자연스럽게 ViewModel을 접하게 될텐데 뷰모델에 Published로 선언되는 변수를 뷰에서 @ObservedObject로 사용하게 된다.
class A: ObservableObject { @Published var a: Int = 0 } struct B: View { @ObservedObject var b = A() var body: some View { Text("\(b.a)") //0 } }
기존의 객체지향과 동일하게 객체를 사용하여 변수를 사용한다. 더 자세한 예제를 살펴보자
import SwiftUI class Setting:ObservableObject{ @Published var score:Int = 0 } struct ContentView: View { @ObservedObject var score = Setting() var body: some View { VStack { Text("카운트 : \(score.score)").font(.largeTitle) Button(action: { score.score += 1 }){ Image(systemName: "globe") .imageScale(.large) .foregroundColor(.black) } .padding() } } } struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView() } }
버튼이 클릭이 되면 Setting클래스의 객체가 호출이 되고 값이 업데이트 됨에 따라 뷰를 새로 그린다. (@State와 매우 흡사한 형태)
@State에 대한 내용을 완벽히 숙지 했다면 이번 개념도 어렵지는 않을 것이다. 같은 역할을 하는 클래스하나에 다른 뷰로 이 클래스에 접근하기 위해 이 방식을 채택한다. 하지만 이것도 상황에 맞게 잘 구분해서 쓰도록하자
'iOS > SWIFTUI' 카테고리의 다른 글
[SwiftUI] - GeometryReader (0) 2024.07.26 [SwiftUI] - @ViewBuilder (0) 2024.07.16 [SWIFTUI] #문법 - @Binding (1) 2023.01.04 [SWIFTUI] #문법 - @State (0) 2022.10.09