gpt4 book ai didi

swift - 转义闭包捕获变异的 'self' 参数

转载 作者:行者123 更新时间:2023-12-03 19:18:31 24 4
gpt4 key购买 nike

我正在尝试订阅由 combineLatest 生成的 observable , 之后 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
}
}

最佳答案

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

关于swift - 转义闭包捕获变异的 'self' 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59939788/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com