簡體   English   中英

在Swift中將CBUUID轉換為字符串

[英]Converting CBUUID to String in 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

    }
}

關於將它們作為字符串獲取的任何想法,這樣我就可以將它們存儲在數組中。 如果您有更好的方法,請告訴我。 謝謝!

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

因為UUID不是String類型而是完全不相關的CBUUID類型,所以會導致崩潰。 您可以像這樣從CBUUID提取UUID字符串

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

另外,放棄強制施放運算符as! 這是一個非常糟糕的做法。 使用guard聲明或可選鏈接

問題是服務UUID的類型為CBUUID ,因此您應[CBUUID][CBUUID]而不是NSArray<String> 順便說一下這是一個更好的主意,使用CB...Key常量,而不是字符串字面從檢索值時, 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命名約定,即變量名稱( uidCountNumberuidCountlastUID )的lowerCamelCase。

Apple提供了用於獲取字符串的API:

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

var uuidString: String { get }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM