keysSortedByValueUsingComparator在swift中

Sam*_*her 0 objective-c swift

我正在尝试将一些代码移植到swift.到目前为止,它做起来相当简单,但我仍然坚持使用keysSortedByValueUsingComparator.任何人都可以帮我把我的objc代码翻译成swift吗?

我特意不明白如何翻译这一点:

keysSortedByValueUsingComparator:^(id obj1,id obj2){}

我理解的大括号之间的东西

NSArray* matches = [startingExposureLookup keysSortedByValueUsingComparator:^(id obj1, id obj2) {
    NSNumber* x = [NSNumber numberWithFloat:fabs([obj1 floatValue] - totalExposureTimeInSecondsFloat)];
    NSNumber* y = [NSNumber numberWithFloat:fabs([obj2 floatValue] - totalExposureTimeInSecondsFloat)];
    return [x compare:y];
}];
Run Code Online (Sandbox Code Playgroud)

Siy*_*ong 5

在Swift中,keysSortedByValueUsingComparator:采用一个闭包(即NSComparator),其类型定义为

typealias NSComparator = (AnyObject!, AnyObject!) -> NSComparisonResult

所以你只需要传入一个带有两个值进行比较的闭包,并返回NSComparisonResult中定义的一个枚举值.

这是一个例子:

let dict: NSDictionary = ["b": 2, "a": 1]
dict.allKeys // ["b", "a"]

let keys = dict.keysSortedByValueUsingComparator {
    (obj1: AnyObject!, obj2: AnyObject!) -> NSComparisonResult in
        let x = obj1 as NSNumber
        let y = obj2 as NSNumber
        return x.compare(y)
}

keys // ["a", "b"]
Run Code Online (Sandbox Code Playgroud)

请注意,Swift可以推断闭包的参数类型和返回值的类型,因此在传入闭包时可以省略类型声明:

let keys = dict.keysSortedByValueUsingComparator {
    (obj1, obj2) in
        let x = obj1 as NSNumber
        let y = obj2 as NSNumber
        return x.compare(y)
}
Run Code Online (Sandbox Code Playgroud)