使用闭包初始化属性时将 self 设置为委托

Fel*_*rri 1 closures core-location ios swift

在我的代码中,我在类中创建了一个 CLLocationManager 属性。我想使用闭包来初始化位置管理器,因为我可以在那里设置委托,而且我认为在其声明上配置属性非常棒(就像我以前在 Objective C 中的属性 getter 中所做的那样)。

所以我尝试了这个:

class MapViewController: UIViewController {
var locationManager: CLLocationManager = {
    var lm = CLLocationManager()
    lm.delegate = self
    return lm
}()

extension MapViewController: CLLocationManagerDelegate {
}
Run Code Online (Sandbox Code Playgroud)

但我在 lm.delegate = self 行上收到以下错误。

/Users/.../MapViewController.swift:18:23:无法将“NSObject -> () -> MapViewController”类型的值分配给类型“CLLocationManagerDelegate”?

MapViewController 符合委托(因为下面的扩展),所以我认为“非确认”不是问题。

我知道,我可以在 viewDidLoad 上初始化委托,但如果可以在属性本身上初始化,我真的很想学习这样做,因为它感觉很简洁。

谢谢!

Fel*_*rri 5

哦,我刚刚找到答案:

lazy var locationManager: CLLocationManager = { [unowned self] in
    var lm = CLLocationManager()
    lm.delegate = self
    return lm
}()
Run Code Online (Sandbox Code Playgroud)

从 Mike Buss 撰写的关于 Swift 延迟初始化的这篇很酷的文章中得到它:
http://mikebuss.com/2014/06/22/lazy-initialization-swift/

  • 没有必要使用[unowned self]。原因是立即应用的闭包 {}() 被视为 @noescape。它不保留被捕获的自我。 (2认同)