在运行时发生致命错误(null时解包)

问题描述:

我正在将一个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

我该如何解决? '外设'是肯定的。 –

我不熟悉的图书馆,但基于您的评论指出,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'。 –