[英]Set self as delegate when Initializing a property with a closure
在我的代碼中,我在我的類中創建了一個 CLLocationManager 屬性。 我想使用閉包來初始化位置管理器,因為我可以在那里設置委托,而且我認為在它們的聲明中配置屬性很棒(就像我在 Objective C 中對屬性 getter 所做的那樣)。
所以我試過這個:
class MapViewController: UIViewController {
var locationManager: CLLocationManager = {
var lm = CLLocationManager()
lm.delegate = self
return lm
}()
extension MapViewController: CLLocationManagerDelegate {
}
但是我在 lm.delegate = self 行上收到以下錯誤。
/Users/.../MapViewController.swift:18:23: 無法將“NSObject -> () -> MapViewController”類型的值分配給“CLLocationManagerDelegate?”
MapViewController 符合委托(因為下面的擴展),所以我不認為“不確認”是問題。
我可以在 viewDidLoad 上初始化委托,我知道,但是如果可以在屬性本身上初始化,我真的很想學習這樣做,因為它感覺很整潔。
謝謝!
哦,我才找到答案。 沒關系。
lazy var locationManager: CLLocationManager = { [unowned self] in
var lm = CLLocationManager()
lm.delegate = self
return lm
}()
從邁克·巴斯(Mike Buss)的有關Swift中的延遲初始化的很酷的文章中獲得了它: http : //mikebuss.com/2014/06/22/lazy-initialization-swift/
對於那些堆棧錯誤的人
Cannot assign value of type '(Foo) -> () -> Foo' to type 'Bar'
就我而言,它是
Cannot assign value of type '(AppDelegate) -> () -> AppDelegate' to type ...
請檢查您是否將它用於惰性變量。 我花了幾分鍾,直到我發現我正在嘗試對let常量進行惰性實例化。
例如,
let foo: Foo = { ... }
相反應該是
lazy var foo: Foo = { ... }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.