2017-03-07 88 views
3

我想补充UIView子类物业与延迟初始化,例如:懒财产与UIView子类

import UIKit 

class MyView: UIView {} 

class Controller: UIViewController { 

    lazy var myView = MyView() 
} 

但我有一个错误:

Cannot convert values type 'UIView' to specified type 'MyView' I can fix the error with type of property:

lazy var myView: MyView = MyView() 

或改变初始化:

let myView = MyView() 

但为什么Swift不能推断这种类型?

+0

如果我调用其中一个UIView初始化函数'lazy var myView = MyView(frame:.zero)',也可以。原来的问题仍然存在...... – kennytm

+0

@kennytm,好评,谢谢! –

+0

不知道为什么,但您需要调用指定的初始化程序以使其正常工作。 –

回答

1

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

lazy var myView:MyView = MyView() 
+1

为什么?向我展示证据! –

+0

当您使用懒惰时,实际值是通过评估创建的,所以您需要在前面声明其数据类型。您可以通过https://www.hackingwithswift.com/example-code/language/what-are-lazy-变量 – Donal

+0

但为什么我可以在这种情况下提交类型:'lazy var myView = UIView()'? –

0

我试图复制的问题,但与自定义类。并没有发现任何问题。

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

Unable to infer complex closure return type; add explicit type to disambiguate

而且这说得很清楚,不能推断出闭包的返回类型。它看起来很明显,因为我们使用的闭包没有明确的返回类型。

enter image description here

于是,我就用明确的类型提供一个封闭,我现在期待,现在我不需要提供用于redViewlazy属性的显式类型。如预期的那样,它没有为懒惰属性提供类型。

enter image description here

+0

你正在谈论关闭。但我只用默认的初始化子类。 –

0

如果您MyView的提供初始化,那么它将被ok.but为什么呢?我花了几个小时弄清楚,结果是,等待主人回答。

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

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

是的,也适用于[kennytm示例](http://stackoverflow.com/questions/42639651/lazy-property-with-uiview-subclass?noredirect=1#comment72406840_42639651) –