2016-09-19 18 views
1

Я работаю над iOS-приложением, которое использует CentralBluetooth Central Manager. Приложение работало, как ожидалось, до тех пор, пока я не обновился до xCode 8. Это обновление почему-то заставило меня преобразовать код из Swift 2.3 в Swift 3.0 с менеджером конверсий. После этого я получил сообщение об ошибке: «Невозможно преобразовать значение типа« CBManagerState »в ожидаемый тип аргумента« CBCentralManagerState », и я искал ответ, но из-за того, что обновление является новым, нет никаких полезных проблем или документацию, касающуюся CB Bluetooth, используемого с Swift 3.0 или iOS 10.0.Как преобразовать значение типа «CBManagerState» в ожидаемый тип «CBCentralManagerState» после преобразования в синтаксис Swift 3.0?

Линии, отмеченные звездочкой, являются линиями, которые вызвали ошибку.

final class BluetoothSerial: NSObject, CBCentralManagerDelegate, CBPeripheralDelegate { 
    ....//some code here from HM10 Bluetooth Serial 
    var centralManager: CBCentralManager! 
    var state: CBCentralManagerState { get { return centralManager.state } * 

    func centralManagerDidUpdateState(_ central: CBCentralManager) { 
     //note that "didDisconnectPeripheral" won't be called if BLE is turned off while connected 

     connectedPeripheral = nil 
     pendingPeripheral = nil 

     //send it to the delegate 
     delegate.serialDidChangeState(central.state) * 
    } 
} 

Любая помощь приветствуется. Спасибо заранее.

+0

Можете ли вы пытались прочитать документацию о BLE? [docs] (https://developer.apple.com/reference/corebluetooth/cbcentralmanagerstate) –

+0

Каков тип centralManager в третьей строке? И какой тип аргумента выполняет delegate.serialDidChangeState()? –

+0

Да, я прочитал документацию, вот как я получил ее, чтобы работать отлично в первую очередь перед обновлением. Тип centralManager - «CBCentralManager!». Ожидаемый тип аргумента delegate.serialDidChangeState() - это «CBCentralManagerState». Это основной исходный код, который я использовал, чтобы заставить его работать до обновления: https://github.com/hoiberg/HM10-BluetoothSerial-iOS Thaaaanks;) – iiiiirev

ответ

4

Это компилирует для меня:

var state: CBCentralManagerState { get { return CBCentralManagerState(rawValue: centralManager.state.rawValue)! } 

Согласно dev forums:

перечислений являются бинарными совместимы, так что ваш код будет работать нормально на любой версии IOS

I» m только используя состояние в centralManagerDidUpdateState func - но делая это следующим образом:

switch central.state{ 
    case .poweredOn: 
     NSLog("CoreBluetooth BLE hardware is powered on"); 
     break 
    case .poweredOff: 
     NSLog("CoreBluetooth BLE hardware is powered off"); 
     break; 
    case .unauthorized: 
     NSLog("CoreBluetooth BLE state is unauthorized"); 
     break 
    case .unknown: 
     NSLog("CoreBluetooth BLE state is unknown"); 
     break; 
    case .unsupported: 
     NSLog("CoreBluetooth BLE hardware is unsupported on this platform"); 
     break; 
    default: 
     break 
    } 

Какой компилятор, кажется, доволен (то есть - удаление предшествующую CBCentralManager из CBCentralManager.poweredOn

+0

Это работало для меня до сих пор. Да, я слышал, что его обесценили в iOS 10, но я не знал, как его заменить или решить эту проблему. Большое спасибо, и спасла мою жизнь (; – iiiiirev

+0

потрясающе! И не проблема - если она исправлена ​​для вас - пожалуйста, поддержите/примите ответ! =] – Andrew