什么相当于`thing = this()||那个在Swift 3中?

时间:2016-12-09 02:31:52

标签: swift3

在大多数语言中,我可以这样写:

this = this() || that()

如果this()返回false,如整数0,则会评估that()。很常见的习语。

Swift 3不会自动将Int投射到Bool,因此成语不起作用。什么是在Swift 3中做到这一点的简洁方法?

2 个答案:

答案 0 :(得分:2)

在Swift中没有确切的等价物,如:

  • Bool之外的其他任何类型都无法转换为Bool

  • 您无法编写返回BoolInt

  • 的函数

在大多数语言中有点夸张,你不能用Java,C#或许多其他强类型语言编写这样的东西。)

Swift中最相似的事情是nil-coalescing operator - ??

假设this()返回Int?(又名Optional<Int>),that()返回Int(非可选):

func this() -> Int? {
    //...
    if someCondition() {
        return intValue
    } else {
        return nil
    }
}

func that() -> Int {
    //...
    return anotherIntValue
}

使用这样的nil-coalescing运算符:

let result = this() ?? that()

在此分配中,如果this()返回非零值,则不评估that(),并将非零值分配给result。当this()返回nil时,会评估that()并将值分配给result

答案 1 :(得分:1)

@OOPer:s answer涵盖的nil合并运算符在这里适合用途,但作为旁注,您可以实现您描述的功能通过重载||运算符,例如对于符合某种类型约束的类型。例如。使用Integer作为类型约束:

extension Bool {
    init<T : Integer>(_ value: T) {
        self.init(value != 0)
    }
}

func ||<T: Integer>(lhs: T, rhs: @autoclosure () -> T) -> T {
    return Bool(lhs) ? lhs : rhs()
}

var thisNum = 0
let thatNum = 12
thisNum = thisNum || thatNum
print(thisNum) // 12