Kotlin“takeIf”语句等效于swift?
我在 kotlin 中的这段代码非常简单,如果满足某个条件,则返回一个值,或者为 null
val speed = location.speed.takeIf { it>=0 }
我试图在 swift 中做同样的事情,但我发现的唯一方法是:
let speed:Double?
if (location.speed>=0){
speed = location.speed
}else{
speed = nil
}
有没有更优雅的方法?
回答
Swift 中没有这样的东西,所以我们需要找到一种方法来takeIf自己编写一个函数。
在 Kotlin 中,takeIf可用于所有对象,作为所有对象的扩展函数T:
inline fun <T> T.takeIf(predicate: (T) -> Boolean): T?
在 Swift 中,你不能在 上写扩展Any,所以我们只能做一个全局函数:
func take<T>(_ value: T, if predicate: (T) throws -> Bool) rethrows -> T? {
try predicate(value) ? value : nil
}
// example usage:
let x = Int.random(in: 0..<10)
let y = take(x, if: { $0 > 5 })
如果你有足够的创造力去想一个运算符,你可以把它变成一个中缀运算符,类似于 KotlintakeIf在接收器和谓词之间的方式。
// I am not creative enough...
infix operator ???
func ???<T>(value: T, predicate: (T) throws -> Bool) rethrows -> T? {
try predicate(value) ? value : nil
}
let a = Int.random(in: 0..<10)
let b = x ??? { $0 > 5 }