这个Swift三元运算符是什么? A == B? C:D

时间:2017-05-16 14:11:52

标签: swift legacy-code

我继承了一个在这一行崩溃的iOS应用程序(意外的零)。你对这里发生的事情有什么最好的解释?

indexPath.row.number == selectedItem ? cell.deselectStyle() : cell.dedeselectStyle()

cell.deselectStyle()cell.dedeselectStyle()函数不返回任何内容。我似乎无法找到有关这里发生的事情的任何信息。 selectedItemNSNumber!

4 个答案:

答案 0 :(得分:0)

崩溃的原因可能是selectedItemnil;我认为您误解了? 选项?之间在实现三元运算符方面的差异。

三元运算符与-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()

如果selectedItemfalse,则上述代码将使用selectedItemnil的值。您可以省略括号,我只是将它们放在那里以便更好地进行可视化。

我希望这会有所帮助:)

答案 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
}