在swift 3.0中排序

Mad*_*dav 3 arrays sorting swift swift3

var arr:Array<Dictionary<String, String>> = [["title":"Mrs","name":"Abc"],["title":"Mr","name":"XYZ"]]
arr.sort { (<#[String : String]#>, <#[String : String]#>) -> Bool in
        <#code#>
    }
Run Code Online (Sandbox Code Playgroud)

我有一系列带有数据格式的字典,如上所示.我想按名称键对这个数组进行排序.我在较老的时候做过:

arr.sort{$0.name < $1.name}
Run Code Online (Sandbox Code Playgroud)

哪个不再有用了.请告诉我如何继续使用此结构并对其进行排序.

谢谢.

Mar*_*n R 5

你有一个表单[String: String] 的字典数组和一个字典没有name属性,所以 $0.name是无效的(在任何 Swift版本中).

检索字典值是通过下标完成的,例如$0["name"],它返回一个可选的.在Swift 2中,您可以直接比较选项(并且nil被认为"少于"任何非nil值).因此在Swift 2中你可以用数组排序

arr.sortInPlace { $0["name"] < $1["name"] }
Run Code Online (Sandbox Code Playgroud)

但是,在Swift 3中删除了可选的比较运算符,并实现了SE-0121 - 删除可选比较运算符 .

因此你必须打开包装$0["name"].如果您100%确定数组中的每个字典都有一个"名称"键,那么您可以像Ahmad F建议的那样强力打开

arr.sort { $0["name"]! < $1["name"]! }
Run Code Online (Sandbox Code Playgroud)

如果不能保证,那么提供一个默认名称,例如通过nil-coalescing运算符的空字符串??:

arr.sort { ($0["name"] ?? "") < ($1["name"] ?? "") }
Run Code Online (Sandbox Code Playgroud)

例:

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"]]
Run Code Online (Sandbox Code Playgroud)

可以看出,首先排序没有"名称"键的字典.最后一个没有名称的条目排序的简单方法是:

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