组合:初始化变异'self'参数

dre*_*kka 2 ios swift swiftui combine

我正在处理结合代码和 Swift UI 并遇到了这个问题。实际上,我想将 a 传递给PublisheraView并在View每次发布者发布更新时进行更新。

这是一个无法编译的示例操场。相反,它提出了一个错误 -Escaping closure captures mutating 'self' parameter.sink(...行了。

import Combine
import SwiftUI

struct MyView: View {

    let cancellable: AnyCancellable
    @State var current: Int = 0

    init<P>(publisher: P) where P: Publisher, P.Output == Int, P.Failure == Never {
        cancellable = publisher.sink { value in
            self.current = value
        }
    }

    var body: some View {
        Text("\(current)")
    }
}

let subject = PassthroughSubject<Int, Never>()
let x = MyView(publisher: subject)
subject.send(5)
Run Code Online (Sandbox Code Playgroud)

目前我已经更改了代码以使用ObservableObject其中包含值的视图模型并告诉该对象发送更新。但我对其他人如何解决这个问题很感兴趣,因为我也想要一个无视图模型选项。

你们都做了什么?

Jon*_*ier 6

您可以使用SwiftUI 中的onReceiveCombine 订阅。这样 SwiftUI 运行时将为您管理订阅,即使您的视图可能会被重新创建多次。PublisherView

struct MyView: View {
    @State var current: Int = 0

    var body: some View {
        Text("\(current)")
            .onReceive(somePublisher) { self.current = $0 }
    }
}
Run Code Online (Sandbox Code Playgroud)

然而,ObservableObject直接使用s 通常是一个更好的主意,因为它们直接集成到 SwiftUI 中。