首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么不能将捕获列表添加到闭包属性中?

为什么不能将捕获列表添加到闭包属性中?
EN

Stack Overflow用户
提问于 2016-08-10 05:02:53
回答 1查看 281关注 0票数 0

在我的代码中,我调用了一些采用闭包的方法。每次我都会给出同样的结论。所以我决定把这封信作为一种财产。每次我调用这些方法时都会传递这个属性。这可以大大减少重复代码。

但是,当我试图将捕获列表[weak self]添加到闭包属性时,编译器不允许我这样做!

'weak' may only be applied to class and class-bound protocol types, not '<<error type>>'

我不知道那是什么意思。

MCVE:

代码语言:javascript
复制
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]捕获列表?但对我来说没什么意义..。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-10 05:56:55

类/Struct属性通常在调用init()方法之前,因此在实例正确分配之前被初始化。由于这一点,属性中的捕获无效,因此还没有初始化self

尽管如此,您还是可以通过懒惰地使属性无效而使其工作:

代码语言:javascript
复制
lazy var closure: (Int) -> Void = {
    [weak self] x in
    self?.num += x
}

这是因为只有在完全初始化self时才能访问惰性属性。

目前,不可能有一个恒定的懒惰属性,但这可能会在未来发生变化。我所知道的唯一解决办法是使用私人设置器:

代码语言:javascript
复制
private(set) lazy var closure: (Int) -> Void = {
    [weak self] x in
    self?.num += x
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38864611

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档