Ios 具有UIView子类的惰性属性
我想添加带有延迟初始化的Ios 具有UIView子类的惰性属性,ios,swift,type-inference,lazy-initialization,Ios,Swift,Type Inference,Lazy Initialization,我想添加带有延迟初始化的UIView子类属性,例如: import UIKit class MyView: UIView {} class Controller: UIViewController { lazy var myView = MyView() } 但我有一个错误: 无法将值类型“UIView”转换为指定的类型“MyView” 我可以使用以下属性类型修复错误: 或将初始化更改为: let myView = MyView() 但是为什么Swift不能推断类型呢?重要的是
UIView
子类属性,例如:
import UIKit
class MyView: UIView {}
class Controller: UIViewController {
lazy var myView = MyView()
}
但我有一个错误:
无法将值类型“UIView”转换为指定的类型“MyView”
我可以使用以下属性类型修复错误:
或将初始化更改为:
let myView = MyView()
但是为什么Swift不能推断类型呢?重要的是,如果您是一个初始化为标记为lazy的变量,那么提供一个类型
lazy var myView:MyView = MyView()
我试图复制该问题,但使用自定义类。没有发现任何问题 需要注意的是,当lazy属性没有自定义时(示例中的
defaultValue
),编译器没有要求我提供显式类型。
但是
对于定制属性(redView
),我必须提供显式类型。
如果我没有提供显式类型,这里就是我得到的
无法推断复杂的闭包返回类型;将显式类型添加到
消除歧义
这就清楚地表明,闭包的返回类型是无法推断的。这似乎很明显,因为我们使用的闭包没有显式的返回类型
因此,我尝试提供一个显式类型的闭包,现在我希望不需要为redView
lazy
属性提供显式类型。正如预期的那样,它在没有为lazy属性提供类型的情况下工作
如果为MyView提供init,那么就可以了。但是为什么呢?我花了几个小时来弄清楚,如果我调用其中一个UIView初始值设定项,结果也是有效的
lazy var myView=myView(frame:.zero)
。原来的问题仍然存在…@kennytm,说得好,谢谢!不知道为什么,但您需要调用指定的初始值设定项以使其正确工作。为什么?给我看证据!当您使用lazy时,实际值是通过计算创建的,因此您需要预先声明其数据类型。您可以检查它,但在这种情况下为什么我可以提交类型:lazy var myView=UIView()
?您谈论的是闭包。但是我只使用了默认初始化的子类
lazy var myView:MyView = MyView()