首页 > 解决方案 > Swift 懒惰初始化不符合协议

问题描述

我在一个协议中声明了几个 UI 组件。

protocol SomeViewContainer {
    var aView: ACustomizedView
    ...
}

class TestViewController: SomeViewContainer {
    var aView: ACustomizedView!

}

上面的代码不会通过,因为编译器认为不TestViewController符合协议。

aView在从远程获取数据后初始化,所以我不能只删除!.
此外,对于协议中声明的其他一些属性,我更喜欢像下面这样的延迟初始化。

lazy var aView: UIView! = {

    }()

仍然无法编译。关于如何使协议与延迟初始化一致,有什么想法吗?

标签: iosswiftswift4.2

解决方案


所以有两个问题,一个具有类型ACustomizedView!的属性与一个属性不同,ACustomizedView这就是它不符合的原因

其次,你应该能够使用惰性。那是你的实际代码吗?

延迟初始化使用自执行闭包,因此它会在调用时自动运行闭包代码,并为属性提供闭包返回的内容

事实上你在封闭内没有任何东西会导致它破裂..

您实际上需要从闭包内部返回一个视图

lazy var aView: UIView = {
    let view = UIView()
    // configure view
    return view
}()

推荐阅读