具有UIView子类的惰性属性

时间:2017-03-07 03:27:46

标签: ios swift type-inference lazy-initialization

我想用延迟初始化添加lazy var myView: MyView = MyView() 子类属性,例如:

let myView = MyView()

但我有一个错误:

  

无法将值类型'UIView'转换为指定类型'MyView'   我可以使用属性类型修复错误:

{{1}}

或将初始化更改为:

{{1}}

但是为什么Swift无法推断这种类型呢?

3 个答案:

答案 0 :(得分:1)

重要的是提供一个类型,如果你被初始化为一个标记为懒惰的变量。

  lazy var myView:MyView = MyView()

答案 1 :(得分:0)

我尝试使用自定义类复制问题。并没有发现任何问题。

有一点需要注意的是,当懒惰属性没有自定义(样本中的defaultValue)时,编译器没有要求我提供显式类型。 但 对于具有自定义(redView)的属性,我必须提供显式类型。 如果我没有提供明确的类型,这就是我得到的。

  

无法推断出复杂的闭包返回类型;添加显式类型   消歧

这说得足够清楚,无法推断闭包的返回类型。它看起来很明显,因为我们使用的闭包没有明确的返回类型。

enter image description here

所以我尝试提供一个带有显式类型的闭包,我现在期待现在我不需要为redView lazy属性提供显式类型。正如预期的那样,它没有提供懒惰属性的类型。

enter image description here

答案 2 :(得分:0)

如果你为MyView提供init,那么它会没问题。但为什么呢?我花了好几个小时才弄清楚,结果是,等待主人回答。

class MyView: UIView {
init() {
    super.init(frame: .zero)
}

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}
}