Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 具有UIView子类的惰性属性_Ios_Swift_Type Inference_Lazy Initialization - Fatal编程技术网

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()