我正在使用Swift 3 / X-Code开发iOS应用程序。这个应用程序需要蓝牙通信,我已经阅读了一些教程和东西,让它工作。到目前为止(UI-wise)一切正常。但是我遇到了以下问题,因为我读过的大部分教程都没有更新到Swift 3我相信这可能是问题所在:
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取消注释任何一行!应用程序崩溃时出现错误“在展开可选值时意外发现nil”
我相信它与peripheral.name有关!这是由X代码本身修复的(它添加了!或者它不会编译) 我不能使peripheral.name显然是可选的,或者应用程序不会编译,我不知道是否有任何其他方式来获取外围设备的名称,我会感激任何指导。 谢谢!
答案 0 :(得分:0)
您可以使用??为print语句添加默认值? “...”
print("Adding peripherals found to array: " + (peripheral.name ?? "name was nil"))
这将使您不必强迫它,或者您可以使用if let
进行简单检查 if let unwrappedName = peripheral.name {
print("Adding peripherals found to array: " + unwrappedName)
}
我建议您阅读optionals以及它们如何工作,这样您就不必依赖IDE来为您做所有更正。
答案 1 :(得分:0)
使用可选绑定安全地打开可选值。
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!")
}
答案 2 :(得分:0)
斯威夫特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
}
}
}