我在下面有以下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 ;
}
}
答案 0 :(得分:4)
Comparable<T>
是Comparable协议。它要求您的类型定义<
运算符。由于它源自Equatable
协议,因此您还需要定义==
运算符:
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
}
}
Comparator<T>
在Java中,Comparator
是一个接口,除了类型通过Comparable
接口为自己定义的类型之外,还允许您定义排序函数。像这样的接口是必要的,因为Java在1.8之前不支持lambdas。在Java 1.8之后,接口构成了lambdas的基础。
Swift没有等效的接口(在Swift中称为协议)。没有必要,因为Swift可以让你在没有@functionalinterface
Java的情况下定义闭包。
通常,Java Comparators只使用一次。在这种情况下,只需使用自定义排序闭包调用sort:
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)
答案 1 :(得分:3)
正如在其他答案和评论中已经提到的那样,在swift中没有什么可以做到的。这只是关闭。
但这是您定义Comparable
class Car {
var id = -1
}
extension Car: Comparable {
static func == (lhs: Car, rhs: Car) -> Bool {
return lhs.id == rhs.id
}
static func < (lhs: Car, rhs: Car) -> Bool {
return lhs.id < rhs.id
}
}
答案 2 :(得分:1)
如果您希望专门复制Java Comparator行为,它返回“小于”的负数,“等于”为0,或者“大于”为正数,则可以编写一个返回的函数ComparisonResult
。
ComparisonResult
是一个包含案例.orderedAscending
,.orderedSame
和.orderedDescending
的枚举。
您可以在Swift中重写您的函数:
extension Car {
func compare(with other: Car) -> ComparisonResult {
return self.carId < other.carId
? .orderedDescending
: self.carId > other.carId ? .orderedAscending : .orderedSame
}
}