2017-09-05 11 views
1

私はSwift 3/X-Codeを使用してiOSアプリケーションを開発しています。このアプリは、ブルートゥースの通信が必要ですし、私はいくつかのチュートリアルとそれを動作させるためのものを読んだことがあります。これまでのところ(UI的に)すべてが機能しています。Swift 3、アンラッピング周辺機器名(Bluetooth 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!") 

} 

上記のコードは数行をコメントアウトしている:私が読んだのチュートリアルのほとんどはスウィフト3に更新されていないので、しかし、私はそれがここで問題になる可能性がありますと信じて、以下の問題を抱えています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つの "名前のない"デバイスを見つけているようですが、代わりにperipheral.name以外のものが良いでしょう(これらを識別するため) –

+0

デバイスの名前を認識するための主な方法が必要です。それ以外に、広告データを使用することもできますが、この関数が提供する周辺機能に関連する他のプロパティは使用できません。 –

0

印刷文にデフォルト値を追加できますか? 「...」

print("Adding peripherals found to array: " + (peripheral.name ?? "name was nil")) 

これは、それを強制することからあなたを維持するか、私はあなたが彼らが仕事についてoptionalsとどのように読むことをお勧め

if let unwrappedName = peripheral.name { 
    print("Adding peripherals found to array: " + unwrappedName) 
    } 

を許可すれば、あなたはとの簡単なチェックを行うだけのことができますすべての修正を行うために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 
     } 
    } 
} 
関連する問題