objective-c - swift 中的 keysSortedByValueUsingComparator

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

最佳答案

在 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"]

注意 Swift 可以 infer the types闭包的参数和返回值的类型,所以你可以在传入闭包时省略类型声明:

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

关于objective-c - swift 中的 keysSortedByValueUsingComparator,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28129703/

相关文章:

iphone - iOS 5中的Facebook SDK 3.5需要Social.framework

ios - 使用 AssetLibraryPhotosViewer 访问照片

ios - 使用观察者发出信号量?

swift - 如何在闭包中调用函数

ios - iPhone 7 不显示网页 View

swift - 在照片项目扩展中显示选定的照片

objective-c - 如何在 Objective-C 的实现文件中调用全局变量

ios - SwiftUI |如果被 ScrollView 取消,则从不调用 DragGestures onEnded

swift - 使用 RxSwift 和 URLSession 处理 401 状态

iphone - NSScanner 循环问题