Swift 闭包不能隐式捕获自身参数。敏捷的

Swift 闭包不能隐式捕获自身参数。敏捷的,swift,xcode,closures,Swift,Xcode,Closures,我有一个错误“闭包不能隐式捕获自身参数”。请告诉我它是怎么修好的 struct RepoJson { ... static func get(url: String, completion: @escaping (RepoJson!) -> ()) { ... } } struct UsersJson { var repo: RepoJson! init() throws { RepoJson.get(url: re

我有一个错误“闭包不能隐式捕获自身参数”。请告诉我它是怎么修好的

struct RepoJson {
...
    static func get(url: String, completion: @escaping (RepoJson!) -> ()) {
        ...
    }
} 

struct UsersJson {
    var repo: RepoJson!
    init() throws {   
        RepoJson.get(url: rep["url"] as! String) { (results:RepoJson?) in
            self.repo = results //error here
        }
   }
}

这是因为您使用的是
struct
。因为结构是有价值的,所以它们被复制(使用COW CopyOnWrite)到闭包中供您使用。现在很明显,复制的属性是由“let”复制的,因此您无法更改它们。如果要使用回调更改局部变量,必须使用
class
。注意弱捕获self(
[weake self]在
中)以避免保留循环。

我使用的类可能重复,它工作正常,但我遇到了一个新问题。如果让repoData=results{self.repo=repoData}}self.repo确实在这里获得了值,那么RepoJson.get(url:rep[“url”]as!String){(results:RepoJson?)。但当我打印数组时,repo等于nil。您是否在初始化类之后立即打印它?因为repo将在回调返回值后填充。我创建按钮并按下它,并且总是等于零。p.s:按照您设置
self.repo=repoData
的方式,它会导致内存泄漏,因为您捕获了self。如果您100%确定回调返回时该类可用,请像这样使用它:
{[unowned self]repoData in self.repo=repoData}
,但在我看来,您的用例无法保证回调返回时,
UsersJson
可用,因此请使用此:
{[unowned self]repoData in self?.repo=repoData}
通常这种情况需要时间,因为有网络呼叫,需要一些时间。以延迟(1秒或2秒)的方式打印,数据将可用。