我正在尝试将一些代码移植到 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/