在Swift 3.0中的排序

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

我有一个字典数组,其数据格式如上所示。我想按照名称键对此数组进行排序。我以前在Swift中这样做:

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

这个结构不再起作用了。请告诉我如何继续使用并对其进行排序。

谢谢。


4
我是不是唯一一个想着“@MartinR要来了!!”的人? :) - Ahmad F
2
点表示法在较旧的 Swift 版本中也无效。 - vadian
同意,无法看出它何时可以工作。我会使用if let来捕获名称值,但如果你想要简短的方式,可以使用arr.sorted { $0["name"]! < $1["name"]! } - Dam
2个回答

5
您有一个形式为[String: String]的字典数组,其中一个字典没有name属性,因此$0.name任何Swift版本中都是无效的。
通过下标检索字典值,例如$0["name"],它返回一个可选项。在Swift 2中,您可以直接比较可选项(并且nil被认为是“小于”任何非nil值)。因此,在Swift 2中,您可以对数组进行排序。
arr.sortInPlace { $0["name"] < $1["name"] }

然而,随着SE-0121 - 移除可选项比较运算符的实现,Swift 3 中已经移除了可选比较运算符。
因此,您需要取消封送 $0["name"]。如果您确信数组中的每个字典都有一个 "name" 键,则可以像Ahmad F 建议的那样强制解封。
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"]]

可以看到,没有“name”键的字典排在最前面。 一个简单的将没有名称的条目排序为最后的方法是:

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

感谢您的澄清。如果键不保证为“name”,是否有一种方法可以让["title": "Dr"](或所有没有"name"键的字典)排在最后? - Ahmad F
1
@dfri:是这样吗?排序不稳定。 - Martin R
@MartinR 你是对的,""""之间自然会受到不稳定排序的影响,我的错 x) - dfrib
@MartinR,你能提供给我你的知识来源吗?我查看了文档,但没有找到类似的内容。如果我能自己学习这些知识,那将会更有帮助。 - Madhup Singh Yadav

4

实际上,我不确定arr.sort{$0.name < $1.name}在“旧的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中不起作用。请查看预期的语法。 - Madhup Singh Yadav

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接