Swift中lazy var为何能解决UITableView代理赋值的类型错误?
为什么用
lazy var能解决这个错误? 核心差异:初始化时机不同
- 用
let定义存储属性时,赋值闭包会在类实例初始化的早期阶段执行——这时候HomeViewController的实例还没完全创建好,self并不是一个完整的、符合UITableViewDataSource/UITableViewDelegate协议的对象,而是处于初始化过程中的半成品,它的类型被解析成了(HomeViewController) -> () -> HomeViewController,根本没法匹配dataSource要求的any UITableViewDataSource?类型,这就是报错的根源。 - 换成
lazy var后,闭包的执行被推迟到第一次访问这个tableView属性的时候,此时HomeViewController的实例已经完全初始化完成,self是一个完整的、符合协议要求的对象,类型完全匹配,错误自然就消失了。
额外补充
Swift对存储属性的初始化有严格规则:非lazy的存储属性必须在实例初始化完成前完成赋值。这就导致它们的初始化闭包无法访问一个就绪的self,而lazy属性的设计就是延迟初始化,刚好避开了这个限制,允许在实例就绪后再执行闭包并引用完整的self。
内容的提问来源于stack exchange,提问作者sudoExclamationExclamation
相关产品推荐
相关产品推荐

