使用新的 SwiftUI Observable 框架将组合发布者分配给变量

zou*_*tre 12 swift swiftui combine

SwiftUI 5 现在使用@Observable包装器来观察类中的更改,而不是使其符合ObservableObject. 这摆脱了@Published我在工作流程中积极使用的包装器:

旧的实现

class OldObservable: ObservableObject {
    
    let model = SomeModel()
    
    @Published var someValue: String?
    
    init() {
        setupSubscribers()
    }
    
    func setupSubscribers() {
        // someValuePublisher could be PassthroughSubject<String?, Never>()
        model.someValuePublisher.assign(to:$someValue)
    }
}
Run Code Online (Sandbox Code Playgroud)

新实施

@Observable
class NewObservable {
    
    let model = SomeModel()
    
    var someValue: String?
    
    init() {
        setupSubscribers()
    }
    
    func setupSubscribers() {
        // Not working anymore
        model.someValuePublisher.assign(to:$someValue)
    }
}
Run Code Online (Sandbox Code Playgroud)

由于 someValue 不是已发布的属性,因此我无法assign(to:)再使用通常的属性。

到目前为止,为了使其工作,我必须使用旧的实现 allocate(to:on) ,我听说这可能会导致保留周期问题,并且相同结果的代码更长。

    var subscribers = Set<AnyCancellable>()
    func setupSubscribers() {
        model.someValuePublisher.assign(to: \.self.someValue, on: self).store(in: &subscribers)
    }
Run Code Online (Sandbox Code Playgroud)

我也可以使用,sink(ReceivedValue:)但它也会延长代码。那么是否有一种新的、简洁的方法将组合发布者绑定到新的 Observable 框架呢?