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