簡體   English   中英

使用閉包初始化屬性時將 self 設置為委托

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM