比较Swift中的AnyObject

时间:2014-08-26 09:55:29

标签: objective-c swift

我无法将此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

有更好的方法吗?

2 个答案:

答案 0 :(得分:3)

除非它们确实是AnyObject(即,它们可以是快速的东西),否则将它们(或强制转换)声明为NSObject

答案 1 :(得分:1)

问题不在于AnyObject的接收器类型(没关系;你可以使用AnyObject调用任何已知的objc方法);但是参数类型。 compare:没有单一签名。需要NSString;一个需要NSNumber;一个需要NSDate等,但没有一个是普通的,没有一个需要AnyObject