2017-09-05 35 views
1

我正在使用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显然是可选的,否则应用程序将无法编译,我不知道是否有其他方式来获得所发现的外设的名称,我会很感激任何指导。 谢谢!

回答

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!") 
} 
+0

谢谢你!一个后续问题,看起来我的手机正在查找3个“No Name”设备,除了peripheral.name之外,有什么更好的方法来识别这些设备 –

+0

设备的名称应该是识别它的主要方法。除此之外,您可以使用广告数据,但没有其他与您可以使用的此功能提供的外围设备相关的属性。 –

0

您可以使用??添加一个默认值到打印语句? “......”

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来为你做所有的修正。

+0

在你的第二个例子是没有意义的,用默认值,而不是可选的结合的结果,使用可选的值。 –

+0

谢谢!我不知道那个“??”功能,它似乎很有用。更值得推荐的是显示发现的外围设备,似乎在我附近没有3个名称设备,我不知道它们是什么。 。 。 –

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 
     } 
    } 
}