Swift 3,展开外围名称(蓝牙BLE)
我正在使用Swift 3/X-Code开发iOS应用程序。这个应用程序需要蓝牙通信,我已经阅读了几个教程,让它工作。到目前为止(UI方面)一切正在发挥作用。但是我有下列问题,因为大多数我读过的教程都没有更新,斯威夫特3我认为,可能是这里的问题:Swift 3,展开外围名称(蓝牙BLE)
func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {
//What to do when it discovers a peripheral, add it to the array list
//print("Adding peripherals found to array: " + peripheral.name!)
//peripheralsFound.append(peripheral.name!)
print("Peripheral found!")
}
上面的代码已经几行注释掉,我想要找到的外设添加到数组中,但是如果我对peripheral.name中的任何行取消注释!在它的应用程序崩溃的错误“意外发现零,同时展开可选值”
我相信它与peripheral.name!这是由X代码本身修复的(它添加了!否则它不会编译) 我不能使peripheral.name显然是可选的,否则应用程序将无法编译,我不知道是否有其他方式来获得所发现的外设的名称,我会很感激任何指导。 谢谢!
使用可选绑定来安全地打开可选值。
var peripheralNames = [String]()
func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {
if let name = peripheral.name {
peripheralNames.append(name)
print("Adding peripheral found to array: " + name)
}
print("Peripheral found!")
}
您可以使用??添加一个默认值到打印语句? “......”
print("Adding peripherals found to array: " + (peripheral.name ?? "name was nil"))
这将让你不必强迫它,或者你可以做有一个简单的检查,如果让
if let unwrappedName = peripheral.name {
print("Adding peripherals found to array: " + unwrappedName)
}
我建议你阅读他们关于optionals和如何工作所以你不必依靠IDE来为你做所有的修正。
在你的第二个例子是没有意义的,用默认值,而不是可选的结合的结果,使用可选的值。 –
谢谢!我不知道那个“??”功能,它似乎很有用。更值得推荐的是显示发现的外围设备,似乎在我附近没有3个名称设备,我不知道它们是什么。 。 。 –
斯威夫特3: 尝试这个
var arrayPeripheral: [CBPeripheral] = []
var arrayPeripheralStringName:[String] = []
func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber){
let peripheralLocalName_advertisement = ((advertisementData as NSDictionary).value(forKey: "kCBAdvDataLocalName")) as? String
if (((advertisementData as NSDictionary).value(forKey: "kCBAdvDataLocalName")) != nil){
if !(self.arrayPeripheral.contains(peripheral)){
self.arrayPeripheral.append(peripheral)
self.arrayPeripheralStringName.append(peripehral.name)
peripheral.delegate = self
}
}
}
谢谢你!一个后续问题,看起来我的手机正在查找3个“No Name”设备,除了peripheral.name之外,有什么更好的方法来识别这些设备 –
设备的名称应该是识别它的主要方法。除此之外,您可以使用广告数据,但没有其他与您可以使用的此功能提供的外围设备相关的属性。 –