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 }


以上是Kotlin“takeIf”语句等效于swift?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>