【问题标题】:Comparing AnyObject in Swift比较 Swift 中的 AnyObject
【发布时间】: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

有没有更好的办法?

【问题讨论】:

标签: objective-c swift


【解决方案1】:

除非它们真的是AnyObject(即,它们可以是快速的东西)将它们声明(或强制转换)到NSObject

【讨论】:

  • 这里是NSObject与否无关
  • 实际上@newacct,转换成 NSObject 是可行的,我认为这应该是公认的答案。
【解决方案2】:

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

【讨论】:

  • 但如果AnyObjectid 类似(根据Swift 语言指南),我不应该可以在AnyObject 对象上调用compare 吗?
  • @hpique: AnyObject 就像id 一样,您可以在其上调用任何方法。它与id 不同,因为您可以将id 传递给期望任何对象指针类型的参数,但您不能使用AnyObject
猜你喜欢
  • 1970-01-01
  • 2014-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-30
相关资源
最近更新 更多