Swift 3,打开外围设备名称(蓝牙BLE)

时间:2017-09-05 19:05:49

标签: ios swift

我正在使用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显然是可选的,或者应用程序不会编译,我不知道是否有任何其他方式来获取外围设备的名称,我会感激任何指导。 谢谢!

3 个答案:

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