繁体   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