尝试在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的角度出发遗漏了一些重要的东西...

我可以在没有委托的情况下使用管理器吗?如果没有,我该怎么办才能解决该错误?

最佳答案

这里的诊断具有误导性。问题是您不能在您所在的位置引用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,因此,在这种特殊情况下,使用!版本会更常见。

关于ios - init CBCentralManager:表达式类型不明确,没有更多上下文,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53383490/

10-08 20:58