У вас есть массив словарей вида [String: String]
и словарь не имеет name
свойства, так $0.name
является недействительным (в любого Swift версии).
Получение значения словаря осуществляется посредством подписки, , например. $0["name"]
, который возвращает факультативно. В Swift 2 вы можете сравнить опционы напрямую (и nil
был считался "less" чем любое значение, отличное от 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"]! }
Если это не гарантируется, то укажите имя по умолчанию, например, пустая строка через оператор ноль-коалесцирующего ??
:
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"]]
Как можно видеть, словарь без ключа «имени» заказан первым. Простой способ сортировки записей без имени последний было бы:
arr.sort { ($0["name"] ?? "\u{10FFFF}") < ($1["name"] ?? "\u{10FFFF}") }
Я единственный, кто думает о «@MartinR приходит !!»? :) –
Точечная нотация не работает в * старше swift *. – vadian
Согласен, не могу видеть, когда он может работать. Я бы использовал, если позволить поймать значение имени, но если вы хотите что-то короткое 'arr.sorted {$ 0 [" name "]! <$ 1 ["name"]! } ' – Dam