swift - 在闭包内捕获闭包:Xcode 抛出错误:转义闭包捕获非转义参数
问题描述
我试图在另一个闭包中捕获一个闭包(使用它返回响应),但是当我这样做时(案例 2),我得到一个错误。我的意图是second
在 URLSession 的响应中使用,但不幸的是我不能。
案例1:有效(只是打印,因为没有内部封闭)
import UIKit
class Callback {
// let callback: (String, (String?) -> Void) -> Void
let callback: (String, String) -> Void
public init(callback: @escaping ((String, String) -> Void)) {
self.callback = callback
}
}
Callback { first, second in
let url = URL(string: "https://testapi.com")!
URLSession.init().dataTask(with: url) { data, response, error in
print(second)
}
}
案例 2:错误。Escaping closure captures non-escaping parameter 'second'
import UIKit
class NestedCallback {
// let callback: (String, (String?) -> Void) -> Void
let callback: (String, () -> Void) -> Void
public init(callback: @escaping ((String, () -> Void) -> Void)) {
self.callback = callback
}
}
NestedCallback { first, second in
let url = URL(string: "https://testapi.com")!
URLSession.init().dataTask(with: url) { data, response, error in <---- error: Escaping closure captures non-escaping parameter 'second'
second()
}
}
我已经简化了代码,但实际上我将使用second
这种方式来发送带有参数的数据。(第二个将有2个参数,数据和错误)
我确实考虑为嵌套回调添加另一个 @escaping
声明,但这是不允许的。
解决方案
以下在 Swift 5.4 中编译良好:
import UIKit
class NestedCallback {
let callback: (String, @escaping () -> Void) -> Void
public init(callback: @escaping ((String, @escaping () -> Void) -> Void)) {
self.callback = callback
}
}
NestedCallback(callback: { first, second in
let url = URL(string: "https://testapi.com")!
URLSession.init().dataTask(with: url) { data, response, error in
second()
}
})
推荐阅读
- c# - 从数据库中填充自定义 TreeView,其中父母按字母缩进
- java - 使用 AppCompat 主题后如何删除按钮中多余的白色背景?
- css - 如何使列占用剩余空间
- sql-server - 在数据库中的所有表上执行的 SQL 脚本
- r - 在数据框中过滤具有每个 ID 的最大日期的数据
- reactjs - 服务器端 webpack 无法从 node_modules 读取 css 文件
- java - 如何从文件“历史”中读取 Chrome 年表
- angular - 如何从返回 observable 的函数订阅 observable?
- nginx - 将 Apache 重写规则 (fb_comment_id=) 转换为 NGINX 重写规则
- swift - [[Element].Element] 在 Swift 的 == 运算符重载中是什么意思?