swift - Kotlin "takeIf"语句等效于 swift 吗?

标签 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 })
如果你有足够的创造力去想一个运算符,你可以把它变成一个中缀运算符,类似于 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/

相关文章:

swift - 无法使用 '_' 类型的参数列表调用 '_' - 我应该使用这两个选项中的哪一个?

ios - 如何访问应用程序目录外的文件

ios - 添加照片,并重新加载嵌入式照片容器 View Controller

xcode - xcode 6 beta 7 中大量的警告

ios - 具有给定字体的 2 行 UILabel 的高度

swift - 查找根项的递归模式

swift - 在 swift 中使用 parse 重置密码

ios - 快速按钮按下 Action 加载 tableview Controller 两次

ios - 一旦屏幕在实际设备中被锁定,LockScreen Player 就不会出现。

SwiftUI 关闭模式