我试图从[String:AnyObject]中获取值,但尚未在网络参考上找到答案
方法调用中的一个参数是:
advertisementData: [String : AnyObject]
并且,当我运行代码时,调试行print("\(advertisementData)")
将其中一个值显示为:
[" kCBAdvDataIsConnectable":1," kCBAdvDataServiceUUIDs":< __ NSArrayM 0x13cd812e0>( C9CAB9B8-3ABF-4043-A5AF-9AD00C6074D5]
每次通过时,我都会尝试识别密钥的值:
kCBAdvDataServiceUUIDs
- 每次通过代码时都会发生变化
我希望看看该值是否包含:C9CAB9B8-3ABF-4043-A5AF-9AD00C6074D5
(如本例所示) - 很多时候它没有。
如果是这样我会做点什么。如果什么都不做。
我试过了:
let value = advertisementData["kCBAdvDataServiceUUIDs"]
但它不起作用且错误信息不明确(至少对于这个新手来说,它并不清楚)
如何将此值转换为变量,以便将其与另一个String
值进行比较?
答案 0 :(得分:3)
此代码应该可以使用
import CoreBluetooth
func foo(advertisementData: [String : AnyObject]) {
if let
list = advertisementData["kCBAdvDataServiceUUIDs"] as? [AnyObject]
where (list.contains { ($0 as? CBUUID)?.UUIDString == "C9CAB9B8-3ABF-4043-A5AF-9AD00C6074D5" }) {
print("Found")
}
}
答案 1 :(得分:1)
let value = advertisementData["kCBAdvDataServiceUUIDs"] as! [String]
let result = value.contains("C9CAB9B8-3ABF-4043-A5AF-9AD00C6074D5")
print(result ? "Found" : "Not Found")
答案 2 :(得分:0)
首先,您可以将扫描结果限制为特定的服务UUID。 可能要确保在非常拥挤的蓝牙区域中,您不会被CBCentralManager委托中的所有其他垃圾邮件所侵扰。
let serviceUUID = CBUUID(string: "C9CAB9B8-3ABF-4043-A5AF-9AD00C6074D5")
self.centralManager?.scanForPeripherals(withServices: [serviceUUID], options: [CBCentralManagerScanOptionAllowDuplicatesKey: true])
或者在您的CBPeripheralDelegate中:
func centralManager(_ central: CBCentralManager,
didDiscover peripheral: CBPeripheral,
advertisementData: [String : Any],
rssi RSSI: NSNumber)
{
print("peripheral: \(peripheral)")
print(" \(advertisementData)")
print (RSSI)
if let uuids = advertisementData[CBAdvertisementDataServiceUUIDsKey] as? [AnyObject],
uuids.contains(where:{ ($0 as? CBUUID)?.uuidString == "C9CAB9B8-3ABF-4043-A5AF-9AD00C6074D5" }) {
central.connect(peripheral, options: nil)
}
}
答案 3 :(得分:0)
已迅速更新:
使用下面的简单代码;
let yourServiceUUIDString = "FFF0"
if let
mAdvData = advertisementData["kCBAdvDataServiceUUIDs"] as? [AnyObject], (mAdvData.contains { ($0 as? CBUUID)?.uuidString == yourServiceUUIDString}) {
print("BLE device found..!")
}