尝试在Swift 4.2项目中初始化CBCentralManager。 得到注释中显示的错误:
import CoreBluetooth
class SomeClass: NSObject, CBCentralManagerDelegate {
// Type of expression is ambiguous without more context
let manager: CBCentralManager = CBCentralManager(delegate: self, queue: nil)
// MARK: - Functions: CBCentralManagerDelegate
func centralManagerDidUpdateState(_ central: CBCentralManager) { }
}
如果我将self
换成nil
,错误就消失了,所以我认为从符合CBCentralManagerDelegate
到现在,我遗漏了一些重要的东西...
我可以在没有委托的情况下使用经理吗?如果没有,我该怎么做才能解决该错误?
答案 0 :(得分:2)
此处的诊断有误导性。问题是您无法在原位置引用self
(self
将会是类,而不是实例)。
有几种方法可以解决此问题,但是一种常见的方法是lazy
属性:
lazy var manager: CBCentralManager = {
return CBCentralManager(delegate: self, queue: nil)
}()
另一种方法是使用!
变量:
var manager: CBCentralManager!
override init() {
super.init()
manager = CBCentralManager(delegate: self, queue: nil)
}
两者都很丑陋,但是它们是我们目前在Swift中可以做的最好的事情。
请记住,lazy
方法在第一次被引用之前根本不会创建CBCentralManager,因此在这种特殊情况下使用!
版本会更常见。