오늘은 swiftui에서 사용하는 중요한 property wrapper에 대해 포스팅하겠습니다.
@ObservedObject
뷰의 변화가 감지되면 화면을 업데이트하는 역할을 합니다. iOS 14부터 등장한 @StateObject와 매우 유사하며 차이점은 @StateObject 게시 시 자세히 설명하도록 하겠습니다.
Observable을 구독하고 Observable이 변경될 때마다 보기를 무효화하는 속성 래퍼 유형입니다.
개발 문서의 내용을 직역하면 다음과 같다. 앞서 게시한 @State의 경우 구조체 내에서 선언되어 다른 뷰와 데이터를 공유할 수 없는 것이 특징이다. 여기서 포인트는 데이터 변경이 감지되면 보기를 변경하는 것입니다. 새로 그리다그것은. 자세히 알아보기
@ObservedObject를 사용하기 위한 조건은 다음과 같다.
– ObservableObject 프로토콜을 준수하는 객체 사용
– Published를 사용하여 ObservableObject 데이터가 변경되었을 때 알림
MVVM 패턴으로 프로젝트를 진행하다 보면 자연스럽게 ViewModel을 만나게 되고, 뷰에서는 @ObservedObject로 뷰 모델에서 Published로 선언된 변수를 사용하게 됩니다.
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의 내용을 잘 이해하고 있다면 이 개념은 어렵지 않을 것입니다. 동일한 작업을 수행하는 한 클래스는 이 방법을 채택하여 다른 보기에서 이 클래스에 액세스합니다. 하지만 제대로 사용하자