EDIT:
В моем ответе показано, как использовать sorted()
для сортировки массива строк в порядке "нумерация c". Это не совсем то, что спросил ОП.
К ОП: Вы должны принять ответ Вадиана. Это был первый правильный ответ.
Однако я провожу некоторое время в своем ответе, объясняя синтаксис закрытия Swift, поэтому я собираюсь оставить ответ.
Вы можете использовать массив метод sorted()
, который принимает замыкание, которое сравнивает пары объектов и возвращает true, если первый элемент должен стоять первым.
Тогда вы можете использовать метод NSString compare(options:)
, чтобы сделать "цифру c" сравнение строк, где последовательности цифр обрабатываются как числа внутри строки.
Вот фрагмент рабочего кода, который отсортирует ваш массив:
var array = ["5C", "4D", "2H", "13S", "4C", "5H"]
let sorted = array.sorted (by: { (first: String, second: String) -> Bool in
return first.compare(second, options: .numeric) == .orderedAscending
})
Функция sorted()
is a " функция более высокого порядка`, или функция, которая принимает другую функцию в качестве параметра. Для массива строк эта функция принимает 2 строки и возвращает Bool. На самом деле она принимает замыкание, а не функцию, где замыкание является «анонимным» function "(функция без имени.)
Адаптируя код vadian, который дает ПРАВИЛЬНЫЙ ответ на мой фрагмент, это будет выглядеть так:
var array = ["5C", "4D", "2H", "13S", "4C", "5H"]
let sorted = array.sorted (by: { (first: String, second: String) -> Bool in
if first.suffix(1) == second.suffix(1) {
return first.dropLast.compare(second, options: .numeric) == .orderedAscending
} else {
return first.suffix(1) < second.suffix(1)
}
})
* 10 25 * Вы можете переписать вышеупомянутое с помощью нескольких сочетаний клавиш:
С помощью "конечного замыкания" вы пропускаете ()
, который содержит замыкание в качестве параметра, и просто предоставляете замыкание в фигурных скобках после имени функции.
Вы можете пропустить объявление параметров и возвращаемого типа замыкания, а также пропустить оператор возврата:
let sorted = array.sorted { $0.compare($1, options: .numeric) == .orderedAscending }
Для более сложного кода, такого как vadian, который дает правильный ответ, я предлагаю не используя позиционные параметры, как это. Использование локальных переменных, таких как first
и second
, облегчает чтение кода.
Я предлагаю внимательно изучить главу о замыканиях в Apple Swift iBooks, пока вы не поймете различные способы выражения замыканий и их различные сокращенные синтаксисы. Сначала это сбивает с толку, и использование замыканий является основополагающим для использования Swift.