2017-09-05 41 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 
     } 
    } 
}