[英]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.