我继承了一个在这一行崩溃的iOS应用程序(意外的零)。你对这里发生的事情有什么最好的解释?
indexPath.row.number == selectedItem ? cell.deselectStyle() : cell.dedeselectStyle()
cell.deselectStyle()
和cell.dedeselectStyle()
函数不返回任何内容。我似乎无法找到有关这里发生的事情的任何信息。 selectedItem
是NSNumber!
。
答案 0 :(得分:0)
崩溃的原因可能是selectedItem
是nil
;我认为您误解了?
选项与?
之间在实现三元运算符方面的差异。
三元运算符与-Implicitly-检查值是否为nil无关,您可能需要在执行三元组的步骤之前实现guard
语句或if let
(可选绑定)运营商比较。
它应该类似于:
if let selectedItem = selectedItem {
indexPath.row.number == selectedItem ? cell.deselectStyle() : cell.dedeselectStyle()
} else {
print("selectedItem is nil!")
}
或者,如果需要提前退货:
guard let selectedItem = selectedItem else {
print("selectedItem is nil!")
return
}
indexPath.row.number == selectedItem ? cell.deselectStyle() : cell.dedeselectStyle()
为了让您更清楚,请查看以下代码段:
let nilValue: String! = nil
if nilValue == "test" { }
// fatal error: unexpectedly found nil while unwrapping an Optional value
// OR
let isValueTest: Bool = (nilValue == "test") ? true : false
// fatal error: unexpectedly found nil while unwrapping an Optional value
这就是为什么你应该在访问它之前解开它。
答案 1 :(得分:0)
如果您尝试访问它,NSNumber可能会nil
导致崩溃。添加guard
以检查不是nil
。
guard let s = selectedItem?.intValue else {
cell.dedeselectStyle
return
}
indexPath.row == s ? cell.deselectStyle() : cell.dedeselectStyle()
我认为如果NSNumber为nil
,则假设未选中单元格是安全的,但是您应该确实检查代码中的逻辑。
答案 2 :(得分:0)
这是条件陈述。可以把它想象成if
声明:
if indexPath.row.number == selectedItem {
cell.deselectStyle()
} else {
cell.dedeselectStyle()
}
如果条件为真,则将执行?
和:
之间的代码。如果没有,将调用:
之后的代码。您应该知道?
与Optionals无关。
在您的情况下,selectedItem
似乎是nil
。因此,如果selectedItem
不是nil
,则您只需要执行代码,您可以使用if let
语句:
if let selectedItem = selectedItem {
indexPath.row.number == selectedItem ? cell.deselectStyle() : cell.dedeselectStyle()
}
或者,如果是selectedItem
,您可以插入将使用的默认值,而不是nil
:
indexPath.row.number == (selectedItem ?? false) ? cell.deselectStyle() : cell.dedeselectStyle()
如果selectedItem
为false
,则上述代码将使用selectedItem
或nil
的值。您可以省略括号,我只是将它们放在那里以便更好地进行可视化。
我希望这会有所帮助:)
答案 3 :(得分:0)
更好地理解它,在你的游乐场玩
func f0() -> Int { print(0); return 0 }
func f1() -> Int { print(1); return 1 }
func fa() -> String { print("a"); return "a" }
[true, false, true, true].forEach {
$0 ? f0() : f1() // warning: expression of type 'Int' is unused
}
[true, false, true, true].forEach {
_ = $0 ? f0() : f1() // OK
}
[true, false, true, true].forEach {
$0 ? f0() : fa() // error: result values in '? :' expression have mismatching types 'Int' and 'String'
}
[true, false, true, true].forEach {
_ = $0 ? ( 1 == f0()) : ( "A" == fa()) // OK
}