gpt4 book ai didi

objective-c - 在 Swift 中比较 AnyObject

转载 作者:可可西里 更新时间:2023-11-01 00:53:47 24 4
gpt4 key购买 nike

我在将此 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 协议(protocol),因为它没有标记为 @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

有没有更好的办法?

最佳答案

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

关于objective-c - 在 Swift 中比较 AnyObject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25502914/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com