什么是Java的比较器接口的Swift等价物

时间:2017-08-17 18:33:21

标签: 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 ;
   }

}

3 个答案:

答案 0 :(得分:4)

Swift相当于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
    }
}

Swift相当于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
    }
}