在运行时发生致命错误(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]];
}
什么是实际发生的?
我不熟悉的图书馆,但基于您的评论指出,peripherals
是“肯定”的含蓄展开可选的,你会想是这样的:
if (self.ble.peripherals?.count ?? 0) == 0 {
self.ble.findPeripherals(2)
}
我们仍然可以使用可选绑定&解包技巧,即使隐式解包选项。
所以,首先我们使用可选的展开得到计数:
self.ble.peripherals?.count
这要么返回count
的peripherals
如果peripherals
是非nil
,或将返回nil
安全。
接下来,我们钉在无合并运算符:
self.ble.peripherals?.count ?? 0
所以,当左半回报nil
,我们将改用0
。
现在我们比较,与0
你试图做:
(self.ble?.peripherals?.count ?? 0) == 0
将返回true
时count
是0
或peripherals
是nil
。最终这就是Objective-C代码的确切行为,因为对Objective-C的方法调用返回NULL
/NO
/0
(当==
与0
比较时,全部返回YES
)。
不,这没有帮助。我仍然遇到同样的错误。如果这有帮助,这是链接到库:[链接](https://github.com/RedBearLab/iOS/tree/master/BLEFramework/BLE)BLE.h和BLE.swift有'外设'在其中。 –
可能吗?设置一些断点。做一些调试。找出什么是'nil',而不应该是。 – nhgrif
我这样做,这就是为什么我肯定地说'peripherals'。 –
其中之一是隐式解包可选(无论是'ble'还是'peripherals')。在Objective-C中,发送消息到'nil'不是问题。在Swift中,它是。 – nhgrif
我该如何解决? '外设'是肯定的。 –