在 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
}
}
关于将它们作为字符串获取的任何想法,以便我可以将它们存储在数组中。如果你有更好的方法请告诉我。谢谢!
Apple 提供了一个 API 来获取字符串:
https://developer.apple.com/documentation/corebluetooth/cbuuid/1518742-uuidstring
var uuidString: String { get }
行
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]
而不是 NSArray<String>
。顺便说一句,从 advertisementData
.
检索值时,最好使用 CB...Key
常量而不是字符串文字
一旦您拥有一个 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
) .
我正在扫描蓝牙设备。我想将它们记录在一个字符串数组中。我希望能够保存它们,但出现以下错误:
无法将类型 '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
}
}
关于将它们作为字符串获取的任何想法,以便我可以将它们存储在数组中。如果你有更好的方法请告诉我。谢谢!
Apple 提供了一个 API 来获取字符串:
https://developer.apple.com/documentation/corebluetooth/cbuuid/1518742-uuidstring
var uuidString: String { get }
行
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]
而不是 NSArray<String>
。顺便说一句,从 advertisementData
.
CB...Key
常量而不是字符串文字
一旦您拥有一个 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
) .