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

Ios SwiftUI转义闭包捕获变异的“self”参数,ios,swift,xcode,swiftui,Ios,Swift,Xcode,Swiftui,我有一个视图,可以用两种方式打开。一个带有提供给它的数据,另一个带有对Firestore文档的文档引用。我创建了两个构造函数,第一个提供数据,另一个提供文档引用。 然后我用这个引用进行网络调用,我得到一个错误: 转义闭包捕获变异的“self”参数 你知道怎么解决这个问题吗 @State var request: RequestModel? init(request: RequestModel) { self.request = request } init(reference: Do

我有一个视图,可以用两种方式打开。一个带有提供给它的数据,另一个带有对Firestore文档的文档引用。我创建了两个构造函数,第一个提供数据,另一个提供文档引用。 然后我用这个引用进行网络调用,我得到一个错误:

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

你知道怎么解决这个问题吗

@State var request: RequestModel?

init(request: RequestModel) {
    self.request = request
}

init(reference: DocumentReference) {
    FirestoreService().fetchDocument(documentReference: reference) { (request: RequestModel) in
        self.request = request
    }
}

对象的初始值设定项不能执行任何异步操作。它的任务是立即生成对象,并初始化其所有属性

对象的初始值设定项不能执行任何异步操作。它的任务是立即生成对象,并初始化其所有属性

这可能分为两个不同的问题:

1:不能在诸如'didSet'或'willSet'之类的闭包中更改Struct的属性


2:只有使用@ObservedObject或@EnvironmentObject.etc声明的可观察结构才能在更改属性时调用UI进行更新。因为这种修饰符赋予属性特殊的getter和setter函数,所以这可能分为两个不同的问题:

1:不能在诸如'didSet'或'willSet'之类的闭包中更改Struct的属性


2:只有使用@ObservedObject或@EnvironmentObject.etc声明的可观察结构才能在更改属性时调用UI进行更新。因为这样的修饰符赋予属性特殊的getter和setter函数

很抱歉,上面的答案是错误的


对象的初始值设定项不能执行任何异步操作。它的任务是立即生成对象,并初始化其所有属性

->这是绝对错误的

我在Objective-C/C/Swift中成功地进行了10年的多线程编程:没有任何内存泄漏、数据访问或访问竞争

在制作游戏的过程中,我已经成功地对一些对象进行了异步初始化,尤其是当我需要制作与以性能方式初始化的对象数量相同的对象以及大量惰性对象时

初始值设定项可以执行异步操作,但这里的问题是,无法修改下面的转义闭包中的“self”

init(reference: DocumentReference) {
    FirestoreService().fetchDocument(documentReference: reference) {    
        (request: RequestModel) in
         self.request = request
}
初始化器中详细的闭包是

{        
    @escaping [unowned self] (request: RequestModel) in

        self.request = request
}
因此,闭包中的“self”将比函数寿命长。 上面的代码似乎是视图类型的一部分,创建为结构

如果self是结构或枚举的实例,则始终可以隐式引用self。然而,当self是结构或枚举的实例时,转义闭包无法捕获对self的可变引用。结构和枚举不允许共享可变性,正如在“结构和枚举是值类型”中讨论的那样

因此,“自我”不可能是可变的

这就是为什么您的代码会收到错误消息:转义闭包捕获变异的“self”参数

更好的解决方案是将零件移动到修改器内部的另一个位置,如“DidAspect”

因为提问者没有在这里提供更多的代码。
我无法在此提供更具体的答案。

很抱歉,上面的答案是错误的


对象的初始值设定项不能执行任何异步操作。它的任务是立即生成对象,并初始化其所有属性

->这是绝对错误的

我在Objective-C/C/Swift中成功地进行了10年的多线程编程:没有任何内存泄漏、数据访问或访问竞争

在制作游戏的过程中,我已经成功地对一些对象进行了异步初始化,尤其是当我需要制作与以性能方式初始化的对象数量相同的对象以及大量惰性对象时

初始值设定项可以执行异步操作,但这里的问题是,无法修改下面的转义闭包中的“self”

init(reference: DocumentReference) {
    FirestoreService().fetchDocument(documentReference: reference) {    
        (request: RequestModel) in
         self.request = request
}
初始化器中详细的闭包是

{        
    @escaping [unowned self] (request: RequestModel) in

        self.request = request
}
因此,闭包中的“self”将比函数寿命长。 上面的代码似乎是视图类型的一部分,创建为结构

如果self是结构或枚举的实例,则始终可以隐式引用self。然而,当self是结构或枚举的实例时,转义闭包无法捕获对self的可变引用。结构和枚举不允许共享可变性,正如在“结构和枚举是值类型”中讨论的那样

因此,“自我”不可能是可变的

这就是为什么您的代码会收到错误消息:转义闭包捕获变异的“self”参数

更好的解决方案是将零件移动到修改器内部的另一个位置,如“DidAspect”

因为提问者没有在这里提供更多的代码。 我无法在这里提供更具体的答案。

视图为stru
中旅。试图在结束时改变它们是没有意义的。你能做的最好的就是修改一个副本。你能说得更具体一点吗?视图是结构。试图在结束时改变它们是没有意义的。你能做的最好就是修改一份。你能说得更具体一点吗?那么我怎样才能达到预期的效果呢?我尝试将逻辑移动到函数,并在init上调用它。它可以工作,但是视图没有被更新。如果你有一些数据需要通过网络获取,那就是数据空间中的某种ObserveObject类实例,而不是在实例化时初始化的实例属性。这已经讨论了很多次了。为什么不搜索呢?这是一个开始:好的,我会检查它。。。最后一个问题。。为什么这些调用在.appeage中工作得很好?因为appeage不是对象初始化。那么如何才能达到预期的结果呢?我尝试将逻辑移动到函数,并在init上调用它。它可以工作,但是视图没有被更新。如果你有一些数据需要通过网络获取,那就是数据空间中的某种ObserveObject类实例,而不是在实例化时初始化的实例属性。这已经讨论了很多次了。为什么不搜索呢?这是一个开始:好的,我会检查它。。。最后一个问题。。为什么这些调用在.EXPENCE中工作正常?因为EXPENCE不是对象初始化。