[英]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命名約定,即變量名稱( uidCountNumber
, uidCount
和lastUID
)的lowerCamelCase。
Apple提供了用於獲取字符串的API:
https://developer.apple.com/documentation/corebluetooth/cbuuid/1518742-uuidstring
var uuidString: String { get }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.