Haru's 개발 블로그

[SwiftUI] @StateObject 본문

IOS/SwiftUI

[SwiftUI] @StateObject

Haru_29 2022. 6. 17. 20:04

App의 모델 데이터와 뷰 간의 connection을 만들어 주는 3가지 property wrapper type을 제공한다.

  • ObservedObject
  • EnvironmentObject
  • StateObject

StateObject의 개념

관찰 가능한 개체를 인스턴스화하는 속성 래퍼 유형입니다.

 

 

StateObject의 필요성

 

SwiftUI는 언제든지 다시 뷰를 생성이 가능하다.

-> 주어진 inputs을 가지고 뷰를 이니셜라이징하면 동일한 뷰가 생성이 된다.

-> 뷰 안에서 ObservedObject를 만드는 것은 안전하지 않다.

 

대신에 SwiftUI는 이 목적을 위해 StateObject를 제공해준다.

StateObject를 사용하면 뷰안에서 안전하게 ObservedObject 인스턴스를 만들 수 있다.

 

class Fish: ObservableObject {
	@Published var name = "flatfish"
	let identifier = UUID()
}
struct AquaView: View {
	@StateObject var fish = Fish()

	var body: some View {
    	FishView(fish: fish)
    }
}
struct FishView: View {
	@ObservedObject var fish: Fish
    
    var body: some View {
   		 FishEditView(fish: fish)
    }
}

 

StateObject는 ObseredObject와 같이 작동을 한다.

차이점으로는 SwiftUI는 뷰를 몇번이든 다시 만드는 것은 상관없이 주어진 view instance에 대해 single object instance를 만들고 관리를 한다.

 

SwiftUI는 각각의 뷰 인스턴스에 대하여 distinct object instance 를 만든다. 

그래서 아래의 예제에서 각각의 Aqua View는 unique fish Instance를 가진다. 

VStack {
	AquaView()
    AquaView()
}

 

또한 top level App instance나 앱의  Scene instances 중 하나에서 state object를 만들 수 있다. 

예를 들어 Fish라는 observable object 를 정의하여fish reader app의 fishes collection을 보관하는 경우, 앱의 최상위 구조에 single library instance를 만들 수 있다.

 

@main
struct FishReader: App {
	@StateObject var fish = Fish()
    
    // ...
}
Comments