在大多数语言中,我可以这样写:
this = this() || that()
如果this()
返回false,如整数0,则会评估that()
。很常见的习语。
Swift 3不会自动将Int
投射到Bool
,因此成语不起作用。什么是在Swift 3中做到这一点的简洁方法?
答案 0 :(得分:2)
在Swift中没有确切的等价物,如:
除Bool
之外的其他任何类型都无法转换为Bool
您无法编写返回Bool
或Int
(在大多数语言中有点夸张,你不能用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