Я хочу версию Swift этого кода:
NSArray *sortedNames = [names sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];
Я хочу версию Swift этого кода:
NSArray *sortedNames = [names sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];
var names = [ "Alpha", "alpha", "bravo"]
var sortedNames = names.sorted { $0.localizedCaseInsensitiveCompare($1) == NSComparisonResult.OrderedAscending }
Обновление: предоставление объяснений в соответствии с рекомендациями другого пользователя SO.
В отличие от ObjC, в Swift вы отсортировали() (и sort()) метод, который берет закрытие, которое вы поставляете, которое возвращает логическое значение, чтобы указать, должен ли один элемент быть перед (истинным) или после (false) другим элементом, Элементы для сравнения - $0 и $1. Я использовал localizedCaseInsensitiveCompare, чтобы получить результат, который вы ищете. Теперь localizedCaseInsensitiveCompare возвращает тип упорядочения, поэтому мне нужно было изменить его, чтобы вернуть соответствующее значение bool.
Обновление для Swift 2:
sorted
и sort
были заменены на sort
и sortInPlace
Определите массив начальных имен:
var names = [ "gamma", "Alpha", "alpha", "bravo"]
Метод 1:
var sortedNames = sorted(names, {$0 < $1})
// sortedNames becomes "[Alpha, alpha, bravo, gamma]"
Это может быть дополнительно упрощено:
var sortedNames = sorted(names, <)
// ["Alpha", "alpha", "bravo", "gamma"]
var reverseSorted = sorted(names, >)
// ["gamma", "bravo", "alpha", "Alpha"]
Метод 2:
names.sort(){$0 < $1}
// names become sorted as this --> "[Alpha, alpha, bravo, gamma]"
Если ваш массив не содержит пользовательских объектов (просто строка или тип номера):
var sortedNames = sorted(names, <)
В противном случае, если вы создадите класс объектов пользовательских данных, содержащий пользовательские свойства внутри:
customDataObjectArray.sort({ $0.customProperty < $1.customProperty })
Использование Перегрузка оператора - наиболее эффективный способ сортировки строк на языке Swift.
// OPERATOR OVERLOADING
let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]
var sortedNames = sorted(names, <)
var reverseOrder = sorted(names, >)
В приведенных выше командах >
и <
операторы перегружены в Swift для сортировки строк.
Я тестировал код в Playground и пришел к выводу, что при использовании перегрузки оператора лучше всего сортировать строки.
Скопируйте ниже на Playground.
let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]
var reversed = sorted (names,
// This is a closure
{ (s1 : String, s2 : String) -> Bool in
return s1 > s2
}
)
println(reversed)
var reverseOrder = sorted(names, {s1, s2 in s1 > s2})
var reverseOrder2 = sorted(names, { $0 > $1} )
// OPERATOR OVERLOADING
var reverseOrder3 = sorted(names, >)
Вывод из игровой площадки:
Из вышеприведенного изображения вы можете видеть, что все остальные способы должны перечислять циклы для сортировки 5 строк. Где, как при использовании перегрузки Operator, не требуется перечислять цикл для сортировки строк.
Ссылка из документация Swift
Если вы хотите отсортировать массив в порядке возрастания, используйте синтаксис ниже:
var arrayName = sorted(arrayName, <)
поскольку sorted() является предопределенной функцией в swift и < используется для указания того, что массив следует сортировать в порядке возрастания. Если вы хотите отсортировать массив в порядке убывания, просто замените < на , как показано ниже:
var arrayName = sorted(arrayName, >)
Обычно вы можете использовать встроенный
func sort<T : Comparable>(inout array: [T])
но если вы хотите использовать localizedCaseInsensitiveCompare:
, ваш код может быть переведен непосредственно с помощью NSArray
.
Любой метод, который можно использовать с Objective-C sortedArrayUsingSelector:
, можно использовать с Swift sort
(или sorted
) при условии, что тип вещи в массиве известен. Итак, в вашем коде:
var arr : [String] = // ...
// it is an array of String, so we can use localizedCaseInsensitiveCompare:
sort(&arr) {return $0.localizedCaseInsensitiveCompare($1) == .OrderedAscending}
Аналогично:
var events : [EKEvent] = // ...
sort(&events) {return $0.compareStartDateWithEvent($1) == .OrderedAscending}
В Swift -
let students: Set = ["Kofi", "Abena", "Peter", "Kweku", "Akosua"]
let sortedStudents = students.sorted()
print(sortedStudents)
// Prints "["Abena", "Akosua", "Kofi", "Kweku", "Peter"]"
Чтобы отсортировать элементы вашей последовательности в порядке убывания, передайте оператор больше ( > ) в отсортированный (isOrderedBefore:) метод.
let descendingStudents = students.sorted(isOrderedBefore: >)
print(descendingStudents)
// Prints "["Peter", "Kweku", "Kofi", "Akosua", "Abena"]"