我把一个目标-c代码转换成了斯威夫特,它编译得很完美,但在运行时给了我错误。它说:
致命错误:在展开可选值时意外找到零
那是为什么?代码以objective格式完美运行。
迅捷版:
@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目标-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]];
}到底发生了什么?
发布于 2015-07-12 18:52:00
我不熟悉这个库,但基于您的评论,即peripherals是“肯定”的隐式展开可选选项,您可能需要这样的内容:
if (self.ble.peripherals?.count ?? 0) == 0 {
self.ble.findPeripherals(2)
}我们仍然可以使用可选的绑定和展开技巧,即使是隐式展开选项。
因此,首先我们使用可选的展开来获取计数:
self.ble.peripherals?.count这将返回count of peripherals (如果peripherals不是nil),或者安全地返回nil。
接下来,我们使用Nil合并操作符:
self.ble.peripherals?.count ?? 0因此,每当左侧返回nil时,我们将使用0。
现在,我们将其与0进行比较,就像您试图做的那样:
(self.ble?.peripherals?.count ?? 0) == 0当count是0或peripherals是nil时,它将返回0。最终,这就是Objective代码的确切行为,因为方法调用Objective返回NULL/NO/0 (当==-compared与0一起返回时,它们都返回YES )。
https://stackoverflow.com/questions/31371255
复制相似问题