我无法将此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
(错误: postfix的操作数'? '应该有可选类型;类型是'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
有更好的方法吗?
答案 0 :(得分:3)
除非它们确实是AnyObject
(即,它们可以是快速的东西),否则将它们(或强制转换)声明为NSObject
。
答案 1 :(得分:1)
问题不在于AnyObject
的接收器类型(没关系;你可以使用AnyObject
调用任何已知的objc方法);但是参数类型。 compare:
没有单一签名。需要NSString
;一个需要NSNumber
;一个需要NSDate
等,但没有一个是普通的,没有一个需要AnyObject
。