Swift 5:什么是“转义闭包捕获变异的‘self’参数”以及如何修复它

2024-02-25

大家好,我正在尝试制作一个简单且可重用的 Swift 网络层

也许这不是在视图中循环返回数据的最佳方法,但在我尝试将返回的 Api 数据在 SwiftUI 视图中循环后,我收到错误:

Escaping closure captures mutating 'self' parameter

不知道我在这节课中错过了哪里或什么

这是文件的图片

内容视图.swift

struct ContentView: View {

    var emptyDataArr: [CollectionItem] = []

    init() {
        ServiceLayer.request(router: Router.getSources) { (result: Result<[String : [CollectionItem]], Error>) in
            switch result {
            case .success(let data):
                print(data)
                self.emptyDataArr = data["custom_collections"]!

            case .failure:
                print(result)
            }
        }
    }

    var body: some View {
        VStack (alignment: .leading) {
            Text("No thing yet")
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

服务层类ServiceLayer.swift

class ServiceLayer {
    // 1.
    class func request<T: Codable>(router: Router, completion: @escaping (Result<[String: [T]], Error>) -> ()) {
        // 2.
        var components = URLComponents()
        components.scheme = router.scheme
        components.host = router.host
        components.path = router.path
        components.queryItems = router.parameters
        // 3.
        guard let url = components.url else { return }
        var urlRequest = URLRequest(url: url)
        urlRequest.httpMethod = router.method
        // 4.
        let session = URLSession(configuration: .default)
        let dataTask = session.dataTask(with: urlRequest) { data, response, error in
            // 5.
            guard error == nil else {
                completion(.failure(error!))
                print(error?.localizedDescription)
                return
            }
            guard response != nil else {
                return
            }
            guard let data = data else {
                return
            }
            print(data)
            // 6.
            let responseObject = try! JSONDecoder().decode([String: [T]].self, from: data)
            // 7.
            DispatchQueue.main.async {
                // 8.
                completion(.success(responseObject))
            }
        }
        dataTask.resume()
    }
}

问题是ContentView是一个结构体,这意味着它是一个值类型。你不能将它传递给闭包并改变它。如果这样做,什么都不会改变,因为闭包将有自己独立的结构副本。

您的问题是您混合了视图和模型。给定视图可以有很多很多副本(每次将其传递给函数时,都会创建一个副本)。您不希望这些副本中的每一个都发起请求。相反,将此请求逻辑移至模型对象中,然后让视图观察它。

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

Swift 5:什么是“转义闭包捕获变异的‘self’参数”以及如何修复它 的相关文章

  • 在 ARSCNView 中加载大型 3d 对象 .scn 文件 Aspect 适合屏幕 ARKIT Swift iOS

    我正在使用 3d 模型开发 ARKit 应用程序 为此 我使用了 3D 模型并添加了用于移动 旋转和缩放 3D 模型的手势 现在我只面临 1 个问题 但我不确定这个问题是否与什么有关 3d 模型是否存在问题 或者我的程序是否缺少任何内容 问
  • 将英语日期转换为法语、nsdate、本地化的最佳方法

    我的财产dob of Patient对象是String目前正在存储12 Jan 2017我想将其转换为法语语言环境 例如12 Janv 2017 以下是我的步骤 转换12 Jan 2017 into 1954 09 07 04 00 00
  • Sage One API - unsupported_grant_type

    我正在尝试通过以下方式获取 Sage One API 的访问令牌docs https developers sageone com docs en v1 authentication request access token using G
  • Swift 中的运行时错误处理

    我完全知道 Swift 没有 try catch 机制来捕获异常 好吧 Swift 2 0 现在支持它们 我还了解到 许多 API 方法都会返回一个 NSError 如果出现问题 该错误对象将被填充为错误对象 所以请不要向我指出这个问题 S
  • 在 Swift 3 中,当结果变得过高时如何计算阶乘? [复制]

    这个问题在这里已经有答案了 我编写了这个函数来返回给定数字的阶乘 func factorial n Int gt Int if n 0 return 1 else return n factorial n 1 print factorial
  • for循环中的范围是什么类型?

    当我们写下以下内容时 for i in 1 10 do stuff 我想知道什么类型有范围1 10在函数调用中使用它 例如 myFunc 1 10 如果在定义后放置断点let range 1 lt 10 你会发现它实际上不是一个Range结
  • 取消所有操作+AFNetworking 3.0

    我创建了一个继承自 AFURLSessionManager 的 HTTPServiceProvider 类 添加以下代码来获取数据 let configuration NSURLSessionConfiguration defaultSes
  • UIDocumentInteractionController 显示空白 pdf

    我尝试使用 UIDocumentInteractionController PresentPreviewAnimated 方法在 iOS 设备上显示 pdf 但它一直显示空白文档 我认为这可能与字符编码有关 但我不确定 如果我使用 UIWe
  • 如何从 Swift 调用 Objective-C 代码?

    在 Swift 中 如何调用 Objective C 代码 Apple 提到它们可以在一个应用程序中共存 但这是否意味着在技术上可以重用 Objective C 中创建的旧类 同时在 Swift 中构建新类 在 Swift 中使用 Obje
  • 无法在新的 Xcode 10.2 (iOS 12.2) 中构建 Alamofire 框架

    由于以下错误 我无法在 Xcode 10 2 iOS 12 2 中为 swift 5 构建 Alamofire SWIFT VERSION 3 0 is unsupported supported versions are 4 0 4 2
  • 在 Swift 中寻找“退出”等价物[重复]

    这个问题在这里已经有答案了 我尝试把exit 0 在一个小型测试 命令行 程序中 Xcode 给出了一条错误消息 指出Use of unresolved identifier exit 这让我很困惑 因为这个问题 https stackov
  • Swagger 生成 javascript-closure-angular-client

    我是 swagger 的新手 我从 swagger 的在线编辑器生成了一个 javascript 闭包角度客户端 它给了我一个 DefaultAPI js 和其他与我的对象定义匹配的 JS 文件 我在 swagger 文档和网上搜索了一种在
  • UITextField 文本更改事件

    如何检测文本字段中的任何文本更改 委托方法shouldChangeCharactersInRange适用于某些东西 但它并不能完全满足我的需求 因为在它返回 YES 之前 textField 文本不可用于其他观察者方法 例如在我的代码中ca
  • 如何将渐变应用于 iOS Swift 应用程序的背景视图

    我正在尝试应用渐变作为视图 故事板的主视图 的背景颜色 代码运行 但没有任何变化 我正在使用 xCode Beta 2 和 Swift 这是代码 class Colors let colorTop UIColor red 192 0 255
  • 在 Swift 中获取 UIImage 的主颜色

    我正在尝试在 Swift 中获取 UIImage 的主颜色 并尝试移植这段代码 https stackoverflow com questions 13694618 objective c getting least used and mo
  • 字典 API(词汇)[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有人知道一个好的 NET 字典 API 吗 我对含义不感兴趣 而是我需要能够以多种不同的方式查询单词 返
  • CLLocation Manager如何在一定距离后更新

    我正在使用 CLLocationManager didupdatelocations 如下所示 func locationManager manager CLLocationManager didUpdateLocations locati
  • 如何在 iOS 上压缩 Realm DB?

    我想定期压缩 iOS 上的 Realm 实例以回收空间 我认为该过程是将数据库复制到临时位置 然后将其复制回来并使用新的default realm 文件 我的问题是Realm 其行为就像单例并回收对象 因此我无法真正关闭它并告诉它打开新的
  • 如何在 SwiftUI 中将阴影应用于内部视图?

    我在周围添加了阴影VStack其中包含我的两个文本字段和一个提交按钮 然而 阴影也被应用到了文本框内的两个文本字段 VStack 我在这里缺少什么导致这种情况发生吗 我尝试添加shadow radius 0 在文本字段上 但它不会改变任何内
  • Haskell 排列库函数 - 请澄清一下?

    这是代码permutationsHaskell 中的函数Data List module permutations a gt a permutations xs0 xs0 perms xs0 where perms perms t ts i

随机推荐