gpt4 book ai didi

ios - 错误 : Assigning non-escaping parameter 'publicationQuery' to an @escaping closure

转载 作者:搜寻专家 更新时间:2023-10-30 22:36:57 24 4
gpt4 key购买 nike

我有一个像这样的 View Controller :

class PublicationListViewController: UIViewController {
var publicationQuery: (() -> [Publication])!

func initWith(title: String, publicationQuery: () -> [Publication]) {
self.title = title
self.publicationQuery = publicationQuery
}
}

为什么我会收到“将非转义参数‘publicationQuery’分配给@escaping 闭包”错误?

最佳答案

转义闭包

因为通过将 publicationQuery 存储到一个属性中,您允许它从初始化器中“逃逸”(即使在初始化器完成执行后它仍然存在,因此是保留循环的潜在原因)。为了能够做到这一点,您必须使用 @escaping 注释将其显式标记为转义:

class PublicationListViewController: UIViewController {
var publicationQuery: (() -> [String])!

// notice that now publicationQuery uses @escaping annotation
func initWith(title: String, publicationQuery: @escaping () -> [String]) {
self.title = title
self.publicationQuery = publicationQuery
}
}

Closures documentation转义闭包部分阅读更多关于转义的信息.

防止保留循环

使用转义闭包时,必须小心不要创建循环保留。最简单的方法是使用 capture list创建转义闭包时,在该捕获列表中,您明确捕获 self 作为 weak 引用:

// use [weak self] capture list to make sure that you don't create another strong reference to self
pubController.initWith(title: "Title") { [weak self] () -> [String] in
// use guard to safely unwrap the self
guard let `self` = self else { return }

// here self will be non-optional value that you can directly use
}

关于ios - 错误 : Assigning non-escaping parameter 'publicationQuery' to an @escaping closure,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49034416/

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