在我的代码中,我调用了一些采用闭包的方法。每次我都会给出同样的结论。所以我决定把这封信作为一种财产。每次我调用这些方法时都会传递这个属性。这可以大大减少重复代码。
但是,当我试图将捕获列表[weak self]添加到闭包属性时,编译器不允许我这样做!
'weak' may only be applied to class and class-bound protocol types, not '<<error type>>'
我不知道那是什么意思。
MCVE:
class A {
var num = 0
let closure: (Int) -> Void = {
[weak self] x in
self?.num += x
}
init() {
let b = B()
b.doStuff {
[weak self] x in
self?.num += x
}
}
}
class B {
var stuff: ((Int) -> Void)!
func doStuff(stuff: (Int) -> Void) {
self.stuff = stuff
}
}在init of class A中,我用闭包调用doStuff。在这个闭包中,捕获列表起作用。但是,当我将闭包声明为属性(第4-7行)时,捕获列表不起作用。
这是否意味着闭包属性不包含对self的强引用,并且有一个隐式[unowned self]捕获列表?但对我来说没什么意义..。
发布于 2016-08-10 05:56:55
类/Struct属性通常在调用init()方法之前,因此在实例正确分配之前被初始化。由于这一点,属性中的捕获无效,因此还没有初始化self。
尽管如此,您还是可以通过懒惰地使属性无效而使其工作:
lazy var closure: (Int) -> Void = {
[weak self] x in
self?.num += x
}这是因为只有在完全初始化self时才能访问惰性属性。
目前,不可能有一个恒定的懒惰属性,但这可能会在未来发生变化。我所知道的唯一解决办法是使用私人设置器:
private(set) lazy var closure: (Int) -> Void = {
[weak self] x in
self?.num += x
}https://stackoverflow.com/questions/38864611
复制相似问题