在 Swift 中将 CBUUID 转换为字符串

Eri*_*.18 1 ios core-bluetooth swift

我正在扫描蓝牙设备。我想将它们记录在一个字符串数组中。我希望能够保存它们,但出现以下错误:

无法将“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

    }
}
Run Code Online (Sandbox Code Playgroud)

关于将这些作为字符串的任何想法,以便我可以将它们存储在一个数组中。如果您有更好的方法,请告诉我。谢谢!

mag*_*zbc 6

线路

let uniqueID = (advertisementData["kCBAdvDataServiceUUIDs"] as! NSArray).firstObject! as! String
Run Code Online (Sandbox Code Playgroud)

会产生崩溃,因为 UUID 不是类型String而是完全不相关的CBUUID类型。CBUUID您可以像这样 提取 UUID 字符串

guard let uuids = advertisementData["kCBAdvDataServiceUUIDs"] as? [CBUUID] else { return }
guard let uniqueID = uuids.first?.uuidString else { return }
Run Code Online (Sandbox Code Playgroud)

另外,放弃强制施法运算符 - as!。这是一个非常糟糕的做法。使用guard语句或可选链