Преобразование CBUUID в строку в Swift - PullRequest
0 голосов
/ 07 ноября 2018

Я сканирую устройства BlueTooth. Я хочу записать их в массив строк. Я хочу сохранить их, но получаю следующие ошибки:

Не удалось преобразовать значение типа 'CBUUID' (0x1f2760918) в 'NSString' (0x1f26a42d0).

CoreBT [9728: 3053605] Не удалось преобразовать значение типа 'CBUUID' (0x1f2760918) в 'NSString' (0x1f26a42d0).

У меня есть следующий код ниже. Нет ссылки на массив, так как я даже не могу получить его в строку.

func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {

    if let peripheralName = advertisementData[CBAdvertisementDataLocalNameKey] as? String {


        print("peripheral Name: \(peripheralName)")

        let uniqueID = (advertisementData["kCBAdvDataServiceUUIDs"] as! NSArray).firstObject! as! String 
        // The above line produces an error
        //Removing as! String will work prevent error but still cannot get from "any" to "string"

        let x = advertisementData
        print("x: \(x)")
        let y = advertisementData["kCBAdvDataServiceUUIDs"]
        print("y: \(y)")

        print("uniqueID: \(uniqueID)")
        self.UIDCountNumber = UIDCountNumber + 1
        self.UID_Count.text = String(self.UIDCountNumber)//label counting devices


        self.last_UID.text = uniqueID as? String //Label is not changing

    }
}

Любые мысли о том, чтобы получить их как строки, чтобы я мог хранить их в массиве. Если есть способ получше, пожалуйста, дайте мне знать. Спасибо!

Ответы [ 3 ]

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

Линия

let uniqueID = (advertisementData["kCBAdvDataServiceUUIDs"] as! NSArray).firstObject! as! String

вызывает сбой, потому что UUID не типа String, а совершенно не связанного типа CBUUID. Вы можете извлечь строку UUID из CBUUID примерно так

guard let uuids = advertisementData["kCBAdvDataServiceUUIDs"] as? [CBUUID] else { return }
guard let uniqueID = uuids.first?.uuidString else { return }

Кроме того, откажитесь от оператора приведения - as!. Это действительно плохая практика. Используйте guard операторы или необязательную цепочку

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

Проблема заключается в том, что идентификаторы UUID службы имеют тип CBUUID, поэтому вам следует привести значение [CBUUID] вместо NSArray<String>. Кстати, лучше использовать константы CB...Key вместо литералов String при извлечении значений из advertisementData.

Если у вас есть один экземпляр CBUUID, вы можете использовать uuidString, чтобы преобразовать его в String и отобразить его на UILabel.

func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {

    if let peripheralName = advertisementData[CBAdvertisementDataLocalNameKey] as? String {

        print("peripheral Name: \(peripheralName)")
        guard let uniqueIDs = advertisementData[CBAdvertisementDataServiceUUIDsKey] as? [CBUUID], let uniqueID = uniqueIDs.first else { return }

        let x = advertisementData
        print("x: \(x)")
        let y = advertisementData["kCBAdvDataServiceUUIDs"]
        print("y: \(y)")

        print("uniqueID: \(uniqueID)")
        self.UIDCountNumber = UIDCountNumber + 1
        self.UID_Count.text = String(self.UIDCountNumber)//label counting devices


        self.last_UID.text = uniqueID.uuidString

    }
}

Не имеет отношения к вашей проблеме, но вы должны также соблюдать соглашение об именах Swift, которое lowerCamelCase для имен переменных (uidCountNumber, uidCount и lastUID).

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

Apple предоставляет API для получения строки:

https://developer.apple.com/documentation/corebluetooth/cbuuid/1518742-uuidstring

var uuidString: String { get }
...