在 Swift 中对 NSDictionary 对象的 NSArray 进行排序

Posted

技术标签:

【中文标题】在 Swift 中对 NSDictionary 对象的 NSArray 进行排序【英文标题】:Sort NSArray of NSDictionary objects in Swift 【发布时间】:2014-09-01 08:11:21 【问题描述】:

我从 API 中检索了一些 JSON 数据,现在有一个充满 NSDictionary 对象的 NSArray。每个 NSDictionary 都有一个“名称”键/值对,我想按该键/值对对 NSArray 进行排序。

我已经进行了大量搜索,但我遇到的解决方案似乎都不适用于新的 Swift 语言,我不确定这是否可能是一个错误......

我试过了:

var descriptor: NSSortDescriptor = NSSortDescriptor(key: "name", ascending: true)
var sortedResults: NSArray = results.sortedArrayUsingDescriptors(NSSortDescriptor(key: "name", ascending: true))

但这不会编译说明“NSSortDescriptor 不可转换为 [AnyObject]”。

有什么建议吗?

【问题讨论】:

阅读错误内容:它需要一个数组... 【参考方案1】:

你必须传递一个排序描述符数组(即使它只有一个):

var descriptor: NSSortDescriptor = NSSortDescriptor(key: "name", ascending: true)
var sortedResults: NSArray = results.sortedArrayUsingDescriptors([descriptor])

【讨论】:

使用 xcode 6.1 这给了我一个 'Cannot convert the expression's type '$T7??键入“NSSortDescriptor”,因为我像这样定义了 NSArray var valores = NSMutableArray(contentsOfFile: file) 有什么建议吗?任何帮助都将受到欢迎 太棒了!搜索 2 天后唯一有效的示例!非常感谢。 如果你在 Objective-C 中有这个 -> NSArray *array = [[dictionary allKeys] sortedArrayUsingSelector:@selector(compare:)];有人知道 Swift 中的替代方案吗?【参考方案2】:

为什么不采用旧方式,而不是采用新方式呢? swift Array 类型同时具有sortsorted 方法。您可以提供一个闭包作为排序函数:

var sortedResults= results.sorted 
  (dictOne, dictTwo) -> Bool in 
  // put your comparison logic here
  return dictOne["name"]! > dictTwo["name"]!

【讨论】:

或者,这可以在一行中完成:var sortedResults= results.sorted $0["name"]! > $1["name"]! 确实可以,但我猜 OP 对 Swift 来说有点新,所以我选择了更冗长的闭包语法! 我确实是 Swift 新手,我之前确实尝试过,但无法成功。我想我看到了我错过的东西,稍后会给你一个答案。谢谢! 我相信这会奏效,但我在从 NSArray 桥接到 Array 时遇到了各种麻烦……Kambala 下面的回答虽然有效,但我可以继续使用 NSArray。 如何对多个排序描述符做同样的事情?【参考方案3】:
var arrDescriptor = NSSortDescriptor(key: "", ascending: true)
   var sortDescriptors: NSArray = [arrDescriptor]
   _sortedArray = allKeysArray.sortedArrayUsingDescriptors(sortDescriptors as [AnyObject])

   print(_sortedArray)

【讨论】:

以上是关于在 Swift 中对 NSDictionary 对象的 NSArray 进行排序的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中对字符串进行切片? [复制]

如何在 Swift 中对字体进行样式化?

如何在 Swift 中对对象数组进行排序?

如何在 Swift 中对这个自定义 UITextField 进行单元测试?

在 Swift 中对声音进行延迟排序

swift中对成员“joinWithSeparator”的模糊引用