我在下面有以下 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/