swift - 什么是 Java 的比较器接口(interface)的 Swift 等价物

标签 swift

我在下面有以下 Java 代码,我正在尝试将其相应地转换为 Swift。有人可以帮我解决这个问题吗?谢谢

public class CarsSortById implements Comparator<Cars>{

@Override
public int compare(Cars car1, Cars car2) {
    return (car1.getCarId() < car2.getCarId()) ? -1: 
    (car1.getCarId() > car2.getCarId() ) ? 1:0 ;
   }

}

最佳答案

Swift 相当于 Comparable<T>

Comparable协议(protocol)。它要求您的类型定义一个 <运算符(operator)。因为它源自 Equatable协议(protocol),你需要定义 ==运营商,以及:

class Car {
    let id: Int
    // other fields
}

extension Car: Equatable {
    static func == (lhs: Car, rhs: Car) -> Bool {
        return lhs.id == rhs.id
    }
}

extension Car: Comparable {
    static func < (lhs: Car, rhs: Car) -> Bool {
        return lhs.id < rhs.id
    }
}

Swift 相当于 Comparator<T>

在 Java 中,Comparator是一个接口(interface),除了类型通过 Comparable 为自身定义的函数之外,还可以定义排序函数。界面。像这样的接口(interface)是必需的,因为 Java 在 1.8 之前不支持 lambda。在 Java 1.8 之后,接口(interface)构成了 lambda 的基础。

Swift 没有等效的接口(interface)(在 Swift 中称为协议(protocol))。没有必要,因为 Swift 可以让你在没有 @functionalinterface 的情况下定义闭包。 Java 的废话。

通常,Java 比较器只使用一次。在这种情况下,只需使用自定义排序闭包调用排序:

let carsSortedByID = cars.sorted { $0.id < $1.id }

如果您需要恢复排序闭包,您可以将它分配给一个变量。自然地,将它们作为静态变量存储在它们排序的类型的扩展中是有意义的。:

extension Car {
    static let idSorter: (Car, Car) -> Bool = { $0.id < $1.id }
}

let carsSortedByID = cars.sorted(by: Car.idSorter)

关于swift - 什么是 Java 的比较器接口(interface)的 Swift 等价物,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45742666/

相关文章:

ios - Swift OpenGL 未解析标识符 kCGImageAlphaPremultipliedLast

swift - 如何在 IF 条件下获取枚举的参数值?

ios - Xcode 11.0 Beta 4 构建并运行,但无法存档

ios - “UIAlertView”在 iOS 9.0 中被弃用。将 UIAlertController 与 preferredStyle 的 UIAlertControllerStyleAlert 一起使用

ios - 向下滚动时如何停止刷新tableview?

ios - 拒绝摄像头后访问摄像头出现问题

swift - 如何在同一个循环中同时循环所有 Firebase 子级?

swift - Split View Controller 偶尔会在 iOS 13 上的 iPhone 上显示详细 View

ios - 将 UIButton 放置在具有约束的 UIScrollView 底部

ios - 如何用动画折叠tableview?