来自[String:AnyObject]的iOS Swift值

时间:2016-07-14 16:35:18

标签: ios swift

我试图从[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值进行比较?

4 个答案:

答案 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..!")
    }