init CBCentralManager: тип выражения неоднозначен без дополнительного контекста - PullRequest
0 голосов
/ 20 ноября 2018

Попытка инициализировать CBCentralManager в проекте Swift 4.2. Получите ошибку, показанную в комментарии:

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 ...

Могу ли я пользоваться менеджером без делегата; и если нет, что мне нужно сделать, чтобы устранить ошибку?

1 Ответ

0 голосов
/ 20 ноября 2018

Диагностика здесь вводит в заблуждение.Проблема в том, что вы не можете ссылаться на 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 вообще, пока в первый раз на него не ссылаются, поэтому немного более распространено использование версии ! для этого конкретного случая.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...