为什么在使用闭包创建属性时不允许使用self?

问题描述

// Design Protocol
protocol SendDataDelegate {}

// Design Sender/Delegator
class SendingVC {
    var delegate: SendDataDelegate?
    
    deinit {
        print("Delegator gone")
    }
}

// Design Receiver/Delegate
class ReceivingVC: SendDataDelegate {
    lazy var sendingVC: SendingVC = { // if i don't use lazy,i am not allowed to use self within the closure.
        let vc = SendingVC()
        vc.delegate = self // here
        return vc
    }()
    
    deinit {
        print("Delegate gone")
    }
}

这是什么原因? 根据我在网上发现的内容:由于没有初始化对象,因此自身不可用,这甚至意味着什么?

解决方法

它的意思就是它的意思。

  • 如果您不说lazy,则用等号(=)尝试初始化sendingVC,这是ReceivingVC的实例属性,而ReceivingVC实例本身(self)正在初始化。在self初始化期间提及它是循环的,因此被禁止。

  • 通过说lazy,您是说:在初始化ReceivingVC实例(sendingVC之后的某个时间之前,不要初始化self-也就是说,当其他一些代码引用它时。这样就解决了问题,现在允许提及self

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...