为什么在 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
。
使用原生 Array
,NSMutableArray
是模糊的,因为它不包含类型信息。
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)")
}
}
我正在 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)")
我是不是遗漏了什么?
提前致谢。
尝试将数组元素转换为预期类型 CGPeripheral
。 Swift不知道数组的元素是什么类型
if let thePeripheral = ScanMeshList![index] as? CBPeripheral {
print("ScanMeshList device name = \(thePeripheral.name) , id = \(thePeripheral.identifier)")
}
或者,您可以使用类型化的 Swift 数组 [CBPeripheral]
而不是 NSMutableArray
。
使用原生 Array
,NSMutableArray
是模糊的,因为它不包含类型信息。
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)")
}
}