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

2024-05-11

我有一个可以通过两种方式打开的视图。一个包含提供给它的数据,另一个包含对 Firestore 文档的文档引用。我创建了两个构造函数,在第一个构造函数中我提供数据,在另一个构造函数中我提供文档参考。 然后我使用此引用进行网络调用,但出现错误:

Escaping closure captures mutating 'self' parameter

关于如何解决这个问题有什么想法吗?

@State var request: RequestModel?

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

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

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

对象的初始化程序不能执行任何异步操作。它的工作是立即生成对象,并初始化其所有属性

--> 这是绝对错误的。

10 年来,我已经在 Objective-C/C/Swift 中成功完成了大量的多线程编程:没有任何内存泄漏、数据访问或访问竞争。

我已经成功地在制作游戏时异步初始化了一些对象,特别是。当我需要以高性能方式初始化尽可能多的对象以及许多惰性对象时。

初始化器可以异步执行,但这里的问题是以下转义闭包中的“self”无法修改。

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

初始化程序中的闭包详细信息是

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

        self.request = request
}

因此,闭包中的“self”将比该函数更长寿。 上面的代码似乎是 View 类型的一部分,作为结构体创建。

From https://docs.swift.org/swift-book/LanguageGuide/Closures.html https://docs.swift.org/swift-book/LanguageGuide/Closures.html,

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

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

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

更好的解决方案是将部件移动到修改器内的另一个位置,例如“didAppear()”。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SwiftUI 转义闭包捕获变异的“self”参数 的相关文章

随机推荐

  • 如何将 TGifImage 中的帧提取为位图?

    下面的演示尝试在表单的画布上绘制 GIF 这不起作用 图像不会前进 如何让它发挥作用 procedure TForm1 FormCreate Sender TObject begin GIF TGIFImage Create GIF Loa
  • 为什么 Haskell 的默认字符串实现是一个字符链接列表?

    Haskell 默认值的事实String众所周知 实现在速度和内存方面都效率不高 据我所知 lists一般来说 在 Haskell 中实现为单链表 并且适用于大多数小型 简单数据类型 例如Int 这似乎不是一个好主意 但是对于String这
  • UITableViewCellDeleteConfirmationControl 问题

    我在项目中使用以下代码 if NSStringFromClass subview class isEqualToString UITableViewCellDeleteConfirmationControl 这在 iOS 5 和 6 上运行
  • WPF 应用程序在第一次交互(例如单击按钮)后停止/冻结

    我目前在 WPF 中遇到问题 UI 加载正常 但每当进行第一次用户交互时 例如单击按钮 应用程序似乎会停止 或者例如 如果我有两个显示 MessageBox 的按钮 则第一次单击将等待几秒钟 然后显示MessageBox 但任何后续交互都是
  • 禁用 Firefox 的自动填充

    是否可以禁用 Firefox自动填充功能而不禁用自动完成 我知道我可以这样做 autocomplete off 但我不想禁用自动完成 只是禁用自动填充 Firefox 正在填充一些本应为空的隐藏字段 这主要是用户刷新页面时出现的问题 表单字
  • cmake 不会在更改时重建 externalProject

    我有以下 CMakeLists txt cmake minimum required VERSION 3 0 project addProject include ExternalProject set ExternalProjectCMa
  • “Git 推送非快进更新被拒绝”是什么意思?

    我正在使用 Git 来管理我的两台计算机和我的开发 我尝试将更改提交到 GitHub 但收到此错误 无法将一些参考推送到
  • CameraX 相机加载速度慢

    因此 我从使用旧版相机 api 迁移到 CameraX 尽管设置非常简单 但我注意到一个问题 现在 相机似乎需要比以前几乎两倍 甚至更长 的时间才能开始显示预览 我正在 Galaxy s7 上进行测试 我的代码如下所示 val previe
  • 将占位符添加到我的 html 网站的 Google 自定义搜索引擎中的文本框

    我使用以下代码添加了谷歌自定义搜索引擎 function var cx 005899633628958982661 wekn1lpckzg var gcse document createElement script gcse type t
  • 图像未出现在 Tkinter 上

    我有一个问题Tkinter因为我想添加图像作为框架的背景 但是 我尝试了很多方法但没有显示出来 我在代码的开头 在解决这个问题后我将继续前进 这是我的代码 import Tkinter from Tkinter import sc Tk s
  • 使用Intel的PIN工具来计算程序中缓存命中/未命中的次数

    我一直在尝试编写一个 pintool 来检测给定程序中的缓存命中和未命中情况 我发现有INS IsMemoryRead Write等调用来判断指令是否是LD ST 有没有办法确定指令是否命中或未命中缓存 如果是这样 是否还可以获得从缓存 内
  • 从左到右两排的光滑旋转木马

    我需要制作一个从左到右顺序的两行轮播 也有响应 With slider slick rows 2 slidesToShow 3 responsive breakpoint 768 settings slidesToShow 1 我收到这个订
  • Java 中何时使用原始类型和何时使用引用类型

    在这种情况下你应该使用原始类型 int 或引用类型 Integer This question https stackoverflow com questions 2508918 激发了我的好奇心 在什么情况下你应该使用原始 类型 int
  • 从鼠标位置获取地图纬度经度

    我正在尝试将鼠标在谷歌地图上的位置转换为 LatLng 对象 我看到很多关于通过谷歌地图 点击 事件等获取位置的帖子 如下所示 google maps event addListener map click function event m
  • 当REST客户端和服务器在同一台服务器上时如何避免网络调用

    我有一个 Web 应用程序 其中两个主要组件是网站 在 Groovy 和 Grails 中实现 和后端 RESTful Web 服务 使用 JAX RS Jersey 和 Spring 实现 这两个都将在 Glassfish 中运行 该网站
  • C++调用基类的模板函数

    下面是两个案例 情况 1 Base gt BaseIndirect gt DerivedIndirect 情况 2 基础 gt 派生 在案例 2 中 我可以使用 3 个符号调用基类的模板函数 在情况 1 中 我可以仅使用其中一种符号来调用基
  • Powershell脚本命令持久化

    我开始学习 Powershell 并编写一个模块 psm1 来存储我的函数 然后我将这段代码插入到模块中 以便在修改模块时重新加载模块 function reload Remove Module init Import Module F S
  • 保存具有自定义前向功能的 Bert 模型并将其置于 Huggingface 上

    我创建了自己的 BertClassifier 模型 从预训练开始 然后添加由不同层组成的我自己的分类头 微调后 我想使用 model save pretrained 保存模型 但是当我打印它并从预训练上传时 我看不到我的分类器头 代码如下
  • 如何获得凸包中均匀分布的点?

    给定一组点 points np random randn n 3d points 我想均匀地填充由凸包定义的体积 其中它们位于一个列表 np array of shapenx3 的 3d 点 我可以得到凸包 hull scipy spati
  • SwiftUI 转义闭包捕获变异的“self”参数

    我有一个可以通过两种方式打开的视图 一个包含提供给它的数据 另一个包含对 Firestore 文档的文档引用 我创建了两个构造函数 在第一个构造函数中我提供数据 在另一个构造函数中我提供文档参考 然后我使用此引用进行网络调用 但出现错误 E