【问题标题】:Sorting in swift 3.0在 swift 3.0 中排序
【发布时间】:2016-12-05 11:14:23
【问题描述】:
var arr:Array<Dictionary<String, String>> = [["title":"Mrs","name":"Abc"],["title":"Mr","name":"XYZ"]]
arr.sort { (<#[String : String]#>, <#[String : String]#>) -> Bool in
        <#code#>
    }

我有一个字典数组,其数据格式如上所示。我想通过 name 键对该数组进行排序。我在较旧的 swift 中做到了,例如:

arr.sort{$0.name < $1.name}

这不再起作用了。请让我知道如何继续使用此结构并对其进行排序。

谢谢。

【问题讨论】:

  • 只有我一个人在想“@MartinR 要来了!!”吗? :)
  • 点符号在 older swift 中也不起作用。
  • 我同意,看不到什么时候可以工作。我会使用 if let 来捕获名称值,但是如果您想要简短的 arr.sorted { $0["name"]! &lt; $1["name"]! }

标签: arrays swift sorting swift3


【解决方案1】:

您有一个[String: String] 形式的字典数组 并且字典没有 name 属性,所以 $0.name 无效(在 任何 Swift 版本中)。

检索字典值是通过下标完成的, 例如$0["name"],返回一个可选。 在 Swift 2 中,您可以直接比较选项(nil 是 认为“小于”任何非nil 值)。因此在 Swift 2 您可以使用

对数组进行排序
arr.sortInPlace { $0["name"] < $1["name"] }

但是,可选的比较运算符已在 Swift 3 的实现 SE-0121 – Remove Optional Comparison Operators.

因此你必须解开$0["name"]。 如果您 100% 确定数组中的每个字典都有一个“名称”键 然后你可以用力解开 如Ahmad F suggested

arr.sort { $0["name"]! < $1["name"]! }

如果不能保证,则提供默认名称,例如通过 nil-coalescing 运算符 ?? 得到空字符串:

arr.sort { ($0["name"] ?? "") < ($1["name"] ?? "") }

例子:

var arr = [["title":"Mrs","name":"Abc"], ["title":"Mr","name":"XYZ"], ["title": "Dr"]]
arr.sort { ($0["name"] ?? "") < ($1["name"] ?? "") }
print(arr)
// [["title": "Dr"], ["name": "Abc", "title": "Mrs"], ["name": "XYZ", "title": "Mr"]]

如您所见,没有“名称”键的字典首先排序。 对没有名称 last 的条目进行排序的简单方法是:

arr.sort { ($0["name"] ?? "\u{10FFFF}") < ($1["name"] ?? "\u{10FFFF}") }

【讨论】:

  • 感谢您的澄清。如果键不保证是“name”,有没有办法让 ["title": "Dr"] (或所有没有“name”键的字典)最后排序?
  • @dfri:是这样吗?排序不稳定。
  • @MartinR 你是对的,"" vs "" 自然会“遭受”不稳定的排序,我的坏 x)
  • @MartinR 你能提供我你的知识来源吗?当我查看文档时,没有这样的。如果我也能自己学习它们会更有帮助。
【解决方案2】:

实际上,我不太确定arr.sort{$0.name &lt; $1.name} 是否在“older swift”中工作,但是,它应该是这样的:

var arr:Array<Dictionary<String, String>> = [["title":"Mr","name":"XYZ"], ["title":"Mrs","name":"Abc"]]

print(arr) // [["name": "XYZ", "title": "Mr"], ["name": "Abc", "title": "Mrs"]]

arr.sort {
    ($0["name"])! < ($1["name"])!
}

print(arr) // [["name": "Abc", "title": "Mrs"], ["name": "XYZ", "title": "Mr"]]

希望对您有所帮助。

【讨论】:

  • 这是较旧的 swift。在 swift 3 中不起作用。请查看预期的语法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-16
  • 1970-01-01
  • 1970-01-01
  • 2020-11-09
  • 1970-01-01
  • 2016-11-19
  • 1970-01-01
相关资源
最近更新 更多