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