digamos que temos uma classe personalizada chamada imageFile e essa classe contém duas propriedades.
class imageFile {
var fileName = String()
var fileID = Int()
}
muitos deles armazenados na matriz
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)
pergunta é: como posso classificar a matriz de imagens por 'fileID' ASC ou DESC?
Respostas:
Primeiro, declare sua matriz como uma matriz digitada para que você possa chamar métodos ao iterar:
Então você pode simplesmente fazer:
Swift 2
Swift 3+
O exemplo acima fornece a ordem de classificação desc
fonte
NSManagedObject
subclasse chamada CheckInAndOut . E em um arquivo separado, declarei uma matriz digitada para objetos desse tipo e quando tento classificá- la, recebo um erro Não foi possível encontrar o membro . Alguma ideia de por que é assim?firstName
elastName
em uma matriz dePerson
objetos. Primeiro eu quero classificá-lofirstName
e depoislastName
. Como eu posso fazer isso?images.sortInPlace({ $0.fileID > $1.fileID })
?[ Atualizado para Swift 3 com classificação (por :) ] Isso, explorando um fechamento à direita:
onde você usa
<
ou>
depende de ASC ou DESC, respectivamente. Se você deseja modificar aimages
matriz , use o seguinte:Se você fizer isso repetidamente e preferir definir uma função, uma maneira é:
e depois use como:
fonte
sort
não compila mais com essa sintaxe no Xcode 8. O Xcode 8 diz que$0.fileID < $1.fileID
produz um Bool, não ComparisonResult.Quase todo mundo dá o quão diretamente, deixe-me mostrar a evolução:
você pode usar os métodos de instância da matriz:
Para uma explicação elaborada sobre o princípio de funcionamento da classificação, consulte A função classificada .
fonte
Swift 3
fonte
people.sort { $0.email > $1.email }
Com o Swift 5,
Array
tem dois métodos chamadossorted()
esorted(by:)
. O primeiro método,,sorted()
tem a seguinte declaração:O segundo método,,
sorted(by:)
tem a seguinte declaração:# 1 Classificar em ordem crescente para objetos comparáveis
Se o tipo de elemento dentro de sua coleção
Comparable
estiver em conformidade com o protocolo, você poderá usá-losorted()
para classificar seus elementos em ordem crescente. O seguinte código do Playground mostra como usarsorted()
:# 2 Classificar em ordem decrescente para objetos comparáveis
Se o tipo de elemento dentro de sua coleção
Comparable
estiver em conformidade com o protocolo, você precisará usarsorted(by:)
para classificar seus elementos com uma ordem decrescente.# 3 Classificar em ordem crescente ou decrescente para objetos não comparáveis
Se o tipo de elemento dentro de sua coleção NÃO
Comparable
estiver em conformidade com o protocolo, você precisará usarsorted(by:)
para classificar seus elementos em ordem crescente ou decrescente.Observe que o Swift também fornece dois métodos chamados
sort()
esort(by:)
como equivalentessorted()
esorted(by:)
se você precisar classificar sua coleção no local.fonte
No Swift 3.0
fonte
Você também pode fazer algo como
para que sua matriz de imagens seja armazenada como classificada
fonte
Swift 2 a 4
A resposta original procurou classificar uma matriz de objetos personalizados usando alguma propriedade. Abaixo, mostrarei algumas maneiras úteis de fazer esse mesmo comportamento com estruturas de dados rápidas!
Pequenas coisas fora do caminho, eu mudei o ImageFile levemente. Com isso em mente, crio uma matriz com três arquivos de imagem. Observe que os metadados são um valor opcional, passando nulo como parâmetro.
ImageFile possui uma propriedade chamada size. Para os exemplos a seguir, mostrarei como usar operações de classificação com propriedades como tamanho.
do menor para o maior tamanho (<)
maior para o menor (>)
Em seguida, classificaremos usando o nome da propriedade String. Da mesma maneira, use sort para comparar strings. Mas observe que o bloco interno retorna um resultado de comparação. Este resultado definirá a classificação.
AZ (.orderedAscending)
ZA (.orderedDescending)
A seguir, é minha maneira favorita de classificar; em muitos casos, um terá propriedades opcionais. Agora não se preocupe, vamos classificar da mesma maneira que acima, exceto que precisamos lidar com nada! Em produção;
Eu usei esse código para forçar todas as instâncias da minha matriz com valores de propriedade nulos a serem os últimos. Em seguida, encomende os metadados usando os valores desembrulhados assumidos.
É possível ter uma classificação secundária para opcionais. Por exemplo; era possível mostrar imagens com metadados e ordenadas por tamanho.
fonte
Duas alternativas
1) Solicitando a matriz original com sortInPlace
2) Usando uma matriz alternativa para armazenar a matriz ordenada
fonte
var assignmentsO : [Assignment]
-lo ou combiná-lo em uma linha usandolet assignmentsO = self.assignments.sort({ $0.order < $1.order })
Swift 4.0, 4.1 e 4.2 Primeiro, criei uma matriz mutável do tipo imageFile () como mostrado abaixo
Crie uma imagem mutável de objeto do tipo imageFile () e atribua valor às propriedades, como mostrado abaixo
Agora, anexe este objeto à matriz arr
Agora, atribua as diferentes propriedades ao mesmo objeto mutável, ou seja, imagem
Agora, anexe novamente o objeto de imagem à matriz arr
Agora, aplicaremos a ordem crescente na propriedade fileId nos objetos arr da matriz. Usar <símbolo para ordem crescente
Agora, aplicaremos a ordem decrescente na propriedade fileId nos objetos arr da matriz. Use > símbolo para ordem decrescente
No Swift 4.1. & 4.2 Para ordem classificada, use
fonte
Se você estiver classificando essa matriz em mais de um local, pode fazer sentido tornar seu tipo de matriz Comparável.
fonte
Se você não estiver usando objetos personalizados, mas tipos de valor que implementam o protocolo Comparable (Int, String etc.), você pode simplesmente fazer isso:
Um exemplo:
fonte
myArray.sorted(by: >)
Você retorna uma matriz classificada da propriedade fileID da seguinte maneira:
Swift 2
Swift 3 OU 4
Swift 5.0
fonte
Eu faço assim e funciona:
var images = [imageFile]() images.sorted(by: {$0.fileID.compare($1.fileID) == .orderedAscending })
fonte
Se você deseja classificar a matriz original de objetos personalizados. Aqui está outra maneira de fazer isso no Swift 2.1
Onde
id
está um número inteiro. Você também pode usar o mesmo<
operador paraString
propriedades.Você pode aprender mais sobre seu uso consultando um exemplo aqui: Swift2: Clientes Próximos
fonte
Impressões:
"["Peter", "Kweku", "Kofi", "Akosua", "Abena"]"
fonte
Swift 3 e 4 e 5
Tive algum problema relacionado a maiúsculas e minúsculas
então eu fiz esse código
e depois use o SortImages depois
fonte
Classificar usando o KeyPath
você pode classificar
KeyPath
assim:Ao implementar esta pequena extensão útil.
Hope Swift acrescenta isso em um futuro próximo no núcleo do idioma.
fonte
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]) } }}