您有一个形式为
[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)
可以看到,没有“name”键的字典排在最前面。
一个简单的将没有名称的条目排序为最后的方法是:
arr.sort { ($0["name"] ?? "\u{10FFFF}") < ($1["name"] ?? "\u{10FFFF}") }
arr.sorted { $0["name"]! < $1["name"]! }
。 - Dam