错误:将非转义参数'publicationQuery'分配给@escaping闭包

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了错误:将非转义参数'publicationQuery'分配给@escaping闭包相关的知识,希望对你有一定的参考价值。

我有一个像这样的视图控制器:

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

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

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

答案

逃离闭包

因为通过将publicationQuery存储到属性中,您允许它从初始化器“逃逸”(即使在initiliazer完成执行后它仍然存在,因此是保留周期的潜在原因)。为了能够做到这一点,你必须使用@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的Escaping Closures部分中的转义的更多信息。

防止保留周期

使用转义闭包时,必须注意不要创建保留周期。最简单的方法是在创建转义闭包时使用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
}

以上是关于错误:将非转义参数'publicationQuery'分配给@escaping闭包的主要内容,如果未能解决你的问题,请参考以下文章

错误:转义闭包捕获变异的“自我”参数

转义闭包捕获 Swift 中的变异“self”参数错误

SyntaxError :( unicode错误)'unicodeescape'编解码器无法解码位置2-3的字节:截断 UXXXXXXXX转义[重复]

Swift 3.0 错误:转义闭包只能按值显式捕获 inout 参数

转义 SQL 参数

SQL语句中转义字符怎么写?