2017-03-07 89 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) –