我在 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 })
如果你有足够的创造力去想一个运算符,你可以把它变成一个中缀运算符,类似于 Kotlin takeIf
介于接收者和谓词之间。// 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 }
关于swift - Kotlin "takeIf"语句等效于 swift 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65842032/