2015-07-12 123 views
0

我正在將一個Objective-C代碼轉換爲swift,它編譯完美,但在運行時給我提供了錯誤。它說:在運行時發生致命錯誤(null時解包)

fatal error: unexpectedly found nil while unwrapping an Optional value

這是爲什麼?代碼完美地運行在Objective-C格式中。

SWIFT版本:

@IBAction func conn(sender: UIButton) { 
     if self.ble.CM.state != CBCentralManagerState.PoweredOn{ 

     } 
     if self.ble.peripherals.count == 0 { 
      self.ble.findBLEPeripherals(2) 
     } 
     else { 
      if !(self.ble.activePeripheral != nil) { 
       self.ble.connectPeripheral(self.ble.peripherals.objectAtIndex(0) as! CBPeripheral) 
      } 
     } 

     btnScan.enabled = false 


     indConnecting.startAnimating() 
    } 

此行是在運行時拋出一個錯誤:

if self.ble.peripherals.count == 0 

Objective-C的版本:

- (void) tryToConnectToBLEShield { 
    //Check core bluetooth state 
    if (self.ble.CM.state != CBCentralManagerStatePoweredOn) 


    //Check if any periphrals 
    if (self.ble.peripherals.count == 0) 
     [self.ble findBLEPeripherals:2.0]; 
    else 
     if (! self.ble.activePeripheral) 
      [self.ble connectPeripheral:[self.ble.peripherals objectAtIndex:0]]; 


} 

什麼是實際發生的?

+0

其中之一是隱式解包可選(無論是'ble'還是'peripherals')。在Objective-C中,發送消息到'nil'不是問題。在Swift中,它是。 – nhgrif

+0

我該如何解決? '外設'是肯定的。 –

回答

1

我不熟悉的圖書館,但基於您的評論指出,peripherals是「肯定」的含蓄展開可選的,你會想是這樣的:

if (self.ble.peripherals?.count ?? 0) == 0 { 
    self.ble.findPeripherals(2) 
} 

我們仍然可以使用可選綁定&解包技巧,即使隱式解包選項。

所以,首先我們使用可選的展開得到計數:

self.ble.peripherals?.count 

這要麼返回countperipherals如果peripherals是非nil,或將返回nil安全。

接下來,我們釘在無合併運算符:

self.ble.peripherals?.count ?? 0 

所以,當左半回報nil,我們將改用0

現在我們比較,與0你試圖做:

(self.ble?.peripherals?.count ?? 0) == 0 

將返回truecount0peripheralsnil。最終這就是Objective-C代碼的確切行爲,因爲對Objective-C的方法調用返回NULL/NO/0(當==0比較時,全部返回YES)。

+0

不,這沒有幫助。我仍然遇到同樣的錯誤。如果這有幫助,這是鏈接到庫:[鏈接](https://github.com/RedBearLab/iOS/tree/master/BLEFramework/BLE)BLE.h和BLE.swift有'外設'在其中。 –

+0

可能嗎?設置一些斷點。做一些調試。找出什麼是'nil',而不應該是。 – nhgrif

+0

我這樣做,這就是爲什麼我肯定地說'peripherals'。 –

相關問題