【问题标题】:Set self as delegate when Initializing a property with a closure使用闭包初始化属性时将 self 设置为委托
【发布时间】:2016-12-18 07:16:57
【问题描述】:

在我的代码中,我在班级中创建了一个 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 上初始化委托,但如果可以在属性本身上进行初始化,我真的很想学习这样做,因为它感觉很整洁。

谢谢!

【问题讨论】:

    标签: ios swift closures core-location


    【解决方案1】:

    哦,我刚刚找到答案了:

    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/

    【讨论】:

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

    对于那些遇到错误的人

    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 = { ... }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-15
      • 2017-01-26
      • 1970-01-01
      • 1970-01-01
      • 2022-08-02
      • 1970-01-01
      • 2012-03-25
      相关资源
      最近更新 更多