Допустим, у нас есть собственный класс с именем imageFile, и этот класс содержит два свойства.
class imageFile {
var fileName = String()
var fileID = Int()
}
многие из них хранятся в массиве
var images : Array = []
var aImage = imageFile()
aImage.fileName = "image1.png"
aImage.fileID = 101
images.append(aImage)
aImage = imageFile()
aImage.fileName = "image1.png"
aImage.fileID = 202
images.append(aImage)
вопрос: как я могу отсортировать массив изображений по 'fileID' ASC или DESC?
Ответы:
Сначала объявите ваш массив как типизированный массив, чтобы вы могли вызывать методы при выполнении итерации:
Тогда вы можете просто сделать:
Swift 2
Свифт 3+
Пример выше дает порядок сортировки desc
источник
NSManagedObject
подкласс CheckInAndOut . И в отдельном файле я объявил типизированный массив для объектов этого типа, и когда я пытаюсь отсортировать его, я получаю сообщение об ошибке Could not find member . Есть идеи, почему это так?firstName
иlastName
в массивеPerson
объектов. Сначала я хочу отсортировать его,firstName
а затемlastName
. Как я могу это сделать?images.sortInPlace({ $0.fileID > $1.fileID })
?[ Обновлено для Swift 3 с сортировкой (by :) ] Это, используя замыкающее замыкание:
где вы используете
<
или в>
зависимости от ASC или DESC, соответственно. Если вы хотите изменитьimages
массив , используйте следующее:Если вы собираетесь делать это неоднократно и предпочитаете определять функцию, один из способов:
а затем использовать как:
источник
sort
больше не компилируется с этим синтаксисом в Xcode 8. Xcode 8 говорит, что$0.fileID < $1.fileID
выдает Bool, а не ComparisonResult.Почти каждый дает, как напрямую, позвольте мне показать развитие:
Вы можете использовать методы экземпляра Array:
Подробное описание принципа работы сортировки см. В разделе «Сортированная функция» .
источник
Свифт 3
источник
people.sort { $0.email > $1.email }
С Swift 5,
Array
имеет два методаsorted()
иsorted(by:)
. Первый метод,sorted()
имеет следующее объявление:Второй метод,
sorted(by:)
имеет следующую декларацию:# 1. Сортировка по возрастанию для сопоставимых объектов
Если тип элемента в вашей коллекции соответствует
Comparable
протоколу, вы сможете использовать егоsorted()
для сортировки элементов в порядке возрастания. Следующий код Playground показывает, как использоватьsorted()
:# 2. Сортировка по убыванию для сопоставимых объектов
Если тип элемента в вашей коллекции соответствует
Comparable
протоколу, вам придется использовать егоsorted(by:)
для сортировки элементов в порядке убывания.# 3. Сортировка по возрастанию или убыванию для несопоставимых объектов
Если тип элемента в вашей коллекции НЕ соответствует
Comparable
протоколу, вам придется использовать егоsorted(by:)
для сортировки элементов в порядке возрастания или убывания.Обратите внимание, что Swift также предоставляет два метода, которые называются
sort()
иsort(by:)
как аналоги,sorted()
иsorted(by:)
если вам нужно отсортировать вашу коллекцию на месте.источник
В Swift 3.0
источник
Вы также можете сделать что-то вроде
поэтому ваш массив изображений будет сохранен как отсортированный
источник
Свифт с 2 по 4
Первоначальный ответ пытался отсортировать массив пользовательских объектов с использованием некоторого свойства. Ниже я покажу вам несколько удобных способов сделать то же самое поведение с быстрыми структурами данных!
По мелочам я немного изменил ImageFile. Имея это в виду, я создаю массив с тремя файлами изображений. Обратите внимание, что метаданные являются необязательным значением, в качестве параметра ожидается передача значения nil.
ImageFile имеет свойство с именем size. В следующих примерах я покажу вам, как использовать операции сортировки с такими свойствами, как размер.
от меньшего к большему размеру (<)
от самого большого до самого маленького (>)
Далее мы отсортируем, используя имя свойства String. Таким же образом используйте сортировку для сравнения строк. Но обратите внимание, внутренний блок возвращает результат сравнения. Этот результат будет определять сортировку.
AZ (.orded Ascending)
ZA (.orderedDescending)
Далее мой любимый способ сортировки, во многих случаях у каждого будут дополнительные свойства. Теперь не волнуйтесь, мы будем сортировать так же, как описано выше, за исключением того, что мы должны обрабатывать ноль! В производстве;
Я использовал этот код, чтобы заставить все экземпляры в моем массиве со значениями свойства nil быть последними. Затем упорядочьте метаданные, используя предполагаемые развернутые значения.
Для дополнительных опций возможна вторичная сортировка. Например; можно показать изображения с метаданными и упорядочить по размеру.
источник
Две альтернативы
1) Упорядочение исходного массива с помощью sortInPlace
2) Использование альтернативного массива для хранения упорядоченного массива
источник
var assignmentsO : [Assignment]
или объединить его в одну строку, используяlet assignmentsO = self.assignments.sort({ $0.order < $1.order })
Swift 4.0, 4.1 и 4.2 Сначала я создал изменяемый массив типа imageFile (), как показано ниже
Создайте изображение изменяемого объекта типа imageFile () и присвойте значение свойствам, как показано ниже
Теперь добавьте этот объект в массив
Теперь присвойте разные свойства одному и тому же изменяемому объекту, т.е. изображению
Теперь снова добавьте изображение объекта в массив обр
Теперь, мы будем применять порядок по возрастанию по FILEID собственности в объектах массива обр. Использовать символ < в порядке возрастания
Теперь мы применим порядок по убыванию для свойства fileId в массиве arr. Используйте символ> для сортировки по убыванию
В Swift 4.1. & 4.2 Для отсортированного заказа используйте
источник
Если вы собираетесь сортировать этот массив более чем в одном месте, возможно, имеет смысл сделать ваш тип массива сопоставимым.
источник
Если вы используете не пользовательские объекты, а типы значений, которые реализуют Comparable протокол (Int, String и т. Д.), Вы можете просто сделать это:
Пример:
источник
myArray.sorted(by: >)
Вы возвращаете отсортированный массив из свойства fileID следующим образом:
Swift 2
Свифт 3 ИЛИ 4
Swift 5.0
источник
Я делаю это так, и это работает:
var images = [imageFile]() images.sorted(by: {$0.fileID.compare($1.fileID) == .orderedAscending })
источник
Если вы хотите отсортировать оригинальный массив пользовательских объектов. Вот еще один способ сделать это в Swift 2.1
Где
id
целое число Вы также можете использовать тот же<
оператор дляString
свойств.Вы можете узнать больше о его использовании, посмотрев пример здесь: Swift2: Ближайшие клиенты
источник
Принты:
"["Peter", "Kweku", "Kofi", "Akosua", "Abena"]"
источник
Свифт 3 и 4 и 5
У меня были некоторые проблемы, связанные со строчными и прописными буквами
поэтому я сделал этот код
а затем использовать sortedImages после этого
источник
Сортировка с использованием KeyPath
Вы можете отсортировать по
KeyPath
такому:Благодаря реализации этого небольшого полезного расширения.
Надеюсь, Свифт добавит это в ближайшее время в ядро языка.
источник
public extension MutableCollection where Self: RandomAccessCollection { mutating func sort<T>(_ keyPath: KeyPath<Element, T>, by areInIncreasingOrder: (T, T) throws -> Bool) rethrows where T: Comparable { try sort { try areInIncreasingOrder($0[keyPath: keyPath], $1[keyPath: keyPath]) } }}