원문 : https://www.hackingwithswift.com/quick-start/swiftui/how-to-use-objectbinding-to-create-object-bindings

@ObjectBinding 사용해서 객체 바인딩을 만드는 방법(How to use @ObjectBinding to create object bindings)

object bindings를 사용할때 약간 다르게 작업해야 할 것들 2가지가 있습니다 : BindableObject 프로토콜은 데이터를 저장할 수 있는 클래스로 사용되고, @ObjectBinding 프로퍼티는 bindable 객체 인스턴스를 저장하기 위해 뷰 안에 사용됩니다. 

예를 들어, 다음에 오는 UserSettings 클래스는 BindableObject를 준수합니다.

class UserSettings: BindableObject {
    var didChange = PassthroughSubject<Void, Never>()

    var score = 0 {
        didSet {
            didChange.send(())
        }
    }
}

아주 작은 공간에 많은 것이 있으니, 분해해서 살펴봅시다.

첫번째: didChange는 PassthroughSubject의 인스턴스 입니다. 이는 Combine 프레임워크에서 가져왔으며, 코드를 컴파일하기 위해 import Combine를 추가해야 할 것입니다. passthrough subject가 하는 일은 간단합니다: 객체가 변경됐다고 말하고 싶을때마다, passthrough subject에게 그 일을 하도록 요청합니다. 우리가 전달하는 값은 문자그대로 뷰가 변경되는지를 지켜보는 뷰에도 전달되기 때문에, 그것을 통과(pass through)라고 합니다. PassthroughSubject는 변경한 것에 대해 알리기 때문에, 기술적으로 발행인(publisher)이라고 합니다. 

두번째: PassthroughSubject는 2가지에 걸쳐 제네릭(generic) 입니다: Void와 Never. 첫번째 매개변수 Void는 아무 값도 보내지 않을 것입니다.를 의미합니다. SwiftUI의 경우에 뷰를 새로고침하는 것을 원하기 때문에 값을 보낼 필요가 없습니다 - @ObjectBindingstate에서 새로운 데이터를 자동으로 가져올것입니다. 두번째 매개변수 Never는 결코 오류를 던지지 않을것입니다.를 의미합니다. 원하는 경우에, NetworkError과 같은 사용자정의 오류 타입을 정의하고 대신 보낼수 있지만, bindable 객체 안에서 로컬로 오류를 처리하는 것이 일반적입니다.

세번째: 값이 변할때마다 코드를 실행할수 있도록 UserSetting의 score 프로퍼티에 didSet 프로퍼티 옵져버를 붙였습니다. 우리의 예제 코드에서, score가 변경될때마다, didChange.send(())를 호출하며, 이는 didChange publisher가 모든 구독된 뷰가 새로고침 할 수 있도록 데이터가 변했다는 뉴스를 알리는 것입니다.

다음과 같이 뷰 안쪽에서 UserSettings 클래스를 사용할 수 있습니다.

struct ContentView : View {
    @ObjectBinding var settings = UserSettings()

    var body: some View {
        VStack {
            Text("Your score is \(settings.score)")
            Button(action: {
                self.settings.score += 1
            }) {
                Text("Increase Score")
            }
        }
    }
}

보시다시피, @ObjectBinding 프로퍼티로 설정하는 것외에, 다른 모든 것은 거의 똑같아 보입니다 - SwiftUI는 모든 구현 세부사항을 처리합니다.

하지만 한가지 중요한 차이점이 있습니다 : settings 프로퍼티는 private로 선언되지 않았습니다. 이는 바인딩 객체가 하나의 뷰 이상에서 사용될수 있기 때문이며, 공개(openly)하는 것이 일반적입니다.

경고: publisher를 사용해서 객체가 변경되는 것을 알릴때, 반드시 메인 스레드에서 처리해야 합니다.

Posted by 까칠코더