为什么在 Swift 中打印 NSMutableArray 对象时会显示对 'identifier' 的模糊使用?

Why Ambiguous use of 'identifier' show when print object of NSMutableArray in Swift?

我正在 Swift 和 BLE 中开发。我扫描 BLE 设备并将它们添加到 NSMutableArray。当我尝试打印 NSMutableArray 中的所有对象时,它显示 Ambiguous use of 'identifier'

我在扫描回调中添加设备,如下代码所示:

var ScanMeshList:NSMutableArray?

        func centralManager(central: CBCentralManager, didDiscoverPeripheral peripheral: CBPeripheral, advertisementData: [String : AnyObject], RSSI: NSNumber) {

                print("peripheral name = \(peripheral.name)")
                print("peripheral id = \(peripheral.identifier)")
                print("peripheral rssi = \(RSSI)")

                ScanMeshList?.addObject(peripheral)

            }

并在点击按钮时打印 NSMutableArray 中的所有对象:

@IBAction func StopScan(sender: AnyObject) {
        //for device in ScanMeshList!
        for var index = 0; index < ScanMeshList!.count; index++
        {
            print("ScanMeshList device name = \(ScanMeshList![index].name) , id = \(ScanMeshList![index].identifier)")
        }
    }

但它在 print("ScanMeshList device name = \(ScanMeshList![index].name) , id = \(ScanMeshList![index].identifier)")

处显示错误('identifier' 的用法不明确)

我是不是遗漏了什么?

提前致谢。

尝试将数组元素转换为预期类型 CGPeripheral。 Swift不知道数组的元素是什么类型

if let thePeripheral = ScanMeshList![index] as? CBPeripheral {
    print("ScanMeshList device name = \(thePeripheral.name) , id = \(thePeripheral.identifier)")
}

或者,您可以使用类型化的 Swift 数组 [CBPeripheral] 而不是 NSMutableArray

使用原生 ArrayNSMutableArray 是模糊的,因为它不包含类型信息。

var scanMeshList = [CBPeripheral]()

并且不需要使用可选的。如果没有设备,则数组为空。

这里有一些东西。问题可能出在编译器不知道 ScanMeshList 包含什么这一事实。因为你把它放在一个 NSMutableArray 中,所以没有类型信息。

如果您想在当前状态下使用它,您需要在 for 循环中转换对象。下面的示例:

print("ScanMeshList device name = \((ScanMeshList![index] as! CBCBPeripheral).name) , id = \((ScanMeshList![index] as! CBCBPeripheral).identifier)")

但是我强烈建议利用 swifts 泛型并将 CBPeripheral 对象添加到 swift 类型数组,这样编译器就知道数组中每个对象的类型并避免任何铸造。示例如下:

var scanMeshList:[CBPeripheral] = [CBPeripheral]()

func centralManager(central: CBCentralManager, didDiscoverPeripheral peripheral: CBPeripheral, advertisementData: [String : AnyObject], RSSI: NSNumber) {

    print("peripheral name = \(peripheral.name)")
    print("peripheral id = \(peripheral.identifier)")
    print("peripheral rssi = \(RSSI)")

    scanMeshList.append(peripheral)
}

func StopScan(sender: AnyObject) {
    //for device in scanMeshList!
    for (scanMeshListItem) in scanMeshList {
        print("ScanMeshList device name = \(scanMeshListItem.name) , id = \(scanMeshListItem.identifier)")
    }
}