【发布时间】:2015-07-14 21:25:29
【问题描述】:
我无法将此 Objective-C 代码移植到 Swift。代码必须按给定的property 对目录的内容进行排序。
NSArray *contents = [fileManager contentsOfDirectoryAtURL:directoryURL includingPropertiesForKeys:@[property] options:kNilOptions error:&error];
if (!contents) return nil;
contents = [contents sortedArrayUsingComparator:^NSComparisonResult(NSURL *url1, NSURL *url2) {
id value1;
if ([url1 getResourceValue:&value1 forKey:property error:nil]) return NSOrderedAscending;
id value2;
if ([url2 getResourceValue:&value2 forKey:property error:nil]) return NSOrderedDescending;
return [value1 compare:value2];
}];
return contents
到目前为止我的 Swift 版本:
if let contents = fileManager.contentsOfDirectoryAtURL(directoryURL, includingPropertiesForKeys: [property], options: NSDirectoryEnumerationOptions.allZeros, error: &error) as? [NSURL] {
let sortedContents = contents.sorted({(URL1 : NSURL, URL2 : NSURL) -> Bool in
var value1 : AnyObject?
if !URL1.getResourceValue(&value1, forKey: property, error: nil) { return true }
var value2 : AnyObject?
if !URL2.getResourceValue(&value2, forKey: property, error: nil) { return false }
// How do I compare AnyObject?
return false
})
return sortedContents
} else {
return nil
}
特别是,我不知道如何比较两个 AnyObject 对象。我不能向下转换到Comparable 协议,因为它没有标记为@objc,显然我不能使用可选链接语法调用compare(错误:后缀'?'的操作数应该具有可选类型;类型是'NSComparisonResult')。
当然,总是存在将值向下转换为 String、NSDate 和 NSNumber 的蛮力方法:
if let string1 = value1 as? String {
if let string2 = value2 as? String {
return string1 < string2
}
}
if let date1 = value1 as? NSDate {
if let date2 = value2 as? NSDate {
return date1.compare(date2) == NSComparisonResult.OrderedAscending
}
}
// And so on...
return false
有没有更好的办法?
【问题讨论】:
-
我不认为有一个优雅的解决方案。或许可以传入一个可调用属性的比较。
-
在这里查看我的回答:stackoverflow.com/a/35389443/5389500
标签: objective-c swift