转义闭包捕获变异的“self”参数

chr*_*r0x 8 swift rx-swift

我正在尝试订阅由combineLatest, after生成的可观察值flatMap。如果我在结构中运行此代码,则会收到此错误:

Escaping closure captures mutating 'self' parameter

如果我更改为类,则不会发生错误。我知道使用 struct 我无法异步改变结构的状态,但是,在这种情况下,我实际上没有改变它,或者是吗?

还有另一种方法可以在不使用类的情况下修复它吗?

public struct ViewModel {

    let disposeBag = DisposeBag()
    var relay1: PublishRelay<()>
    var relay2: PublishRelay<()>

    init() {
        relay1 = PublishRelay<()>()
        relay2 = PublishRelay<()>()

        Observable.combineLatest(relay1, relay2)
            .filter { tuple in 1 == 1 } // some boolean logic here
            .flatMap { _ in return Observable<Void>.just(()) } // some map filter here
            .subscribe(onNext: { _ in
                self.doCoolStuff()
            }).disposed(by: disposeBag)
    }

    func doCoolStuff() {
        // Do cool Stuff here
    }
}
Run Code Online (Sandbox Code Playgroud)

Jos*_*ann 5

所有实例方法都会接收对 self 的引用作为隐式第一个参数,这就是为什么您必须捕获 self 才能调用实例方法。如果您实际上不需要任何实例变量,那么创建doCoolStuff()一个static函数,您将不再需要调用它self.(您可以Self.从 Swift 5 开始使用,或者仅使用类型名称ViewModel.)。doCoolStuff如果init 内部定义了一个闭包,您也可以类似地避免此问题。