disons que nous avons une classe personnalisée nommée imageFile et cette classe contient deux propriétés.
class imageFile {
var fileName = String()
var fileID = Int()
}
beaucoup d'entre eux stockés dans Array
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)
la question est: comment puis-je trier le tableau d'images par 'fileID' ASC ou DESC?
Réponses:
Tout d'abord, déclarez votre tableau en tant que tableau typé afin de pouvoir appeler des méthodes lorsque vous itérez:
Ensuite, vous pouvez simplement faire:
Swift 2
Swift 3+
L'exemple ci-dessus donne l' ordre de tri desc
la source
NSManagedObject
sous - classe appelée CheckInAndOut . Et dans un fichier séparé, j'ai déclaré un tableau typé pour les objets de ce type et lorsque j'essaie de le trier , j'obtiens une erreur de membre introuvable . Une idée pourquoi c'est?firstName
etlastName
dans un tableau d'Person
objets. Je veux d'abord trier parfirstName
et ensuitelastName
. Comment puis-je faire cela?images.sortInPlace({ $0.fileID > $1.fileID })
?[ Mis à jour pour Swift 3 avec sort (par :) ] Ceci, exploitant une fermeture de fin:
où vous utilisez
<
ou>
selon ASC ou DESC, respectivement. Si vous souhaitez modifier leimages
tableau , utilisez ce qui suit:Si vous allez le faire à plusieurs reprises et que vous préférez définir une fonction, l'une des façons est la suivante:
puis utiliser comme:
la source
sort
ne compile plus avec cette syntaxe dans Xcode 8. Xcode 8 dit$0.fileID < $1.fileID
produit un Bool et non ComparisonResult.Presque tout le monde donne comment directement, permettez-moi de montrer l'évolution:
vous pouvez utiliser les méthodes d'instance d'Array:
Pour des explications détaillées sur le principe de fonctionnement du tri, voir La fonction triée .
la source
Swift 3
la source
people.sort { $0.email > $1.email }
Avec Swift 5,
Array
a deux méthodes appeléessorted()
etsorted(by:)
. La première méthode,sorted()
a la déclaration suivante:La deuxième méthode,
sorted(by:)
a la déclaration suivante:#1. Trier par ordre croissant pour des objets comparables
Si le type d'élément de votre collection est conforme au
Comparable
protocole, vous pourrez l'utilisersorted()
pour trier vos éléments par ordre croissant. Le code Playground suivant montre comment utilisersorted()
:# 2. Trier par ordre décroissant pour des objets comparables
Si le type d'élément à l'intérieur de votre collection est conforme au
Comparable
protocole, vous devrez utilisersorted(by:)
afin de trier vos éléments avec un ordre décroissant.# 3. Trier par ordre croissant ou décroissant pour les objets non comparables
Si le type d'élément dans votre collection n'est PAS conforme au
Comparable
protocole, vous devrez l'utilisersorted(by:)
pour trier vos éléments par ordre croissant ou décroissant.Notez que Swift fournit également deux méthodes appelées
sort()
et ensort(by:)
tant que contreparties desorted()
etsorted(by:)
si vous devez trier votre collection sur place.la source
Dans Swift 3.0
la source
Vous pouvez également faire quelque chose comme
de sorte que votre tableau d'images sera stocké comme trié
la source
Swift 2 à 4
La réponse d'origine visait à trier un tableau d'objets personnalisés à l'aide d'une propriété. Ci-dessous, je vais vous montrer quelques façons pratiques de faire ce même comportement avec des structures de données rapides!
De petites choses sur le chemin, j'ai changé ImageFile très légèrement. Dans cet esprit, je crée un tableau avec trois fichiers image. Notez que les métadonnées sont une valeur facultative, passant nil car un paramètre est attendu.
ImageFile a une propriété nommée taille. Pour les exemples suivants, je vais vous montrer comment utiliser les opérations de tri avec des propriétés comme la taille.
du plus petit au plus grand (<)
du plus grand au plus petit (>)
Ensuite, nous allons trier en utilisant le nom de la propriété String. De la même manière, utilisez sort pour comparer les chaînes. Mais notez que le bloc interne renvoie un résultat de comparaison. Ce résultat définira le tri.
AZ (.orderedAscending)
ZA (.orderedDescending)
Ensuite, c'est ma façon préférée de trier, dans de nombreux cas, on aura des propriétés facultatives. Maintenant ne vous inquiétez pas, nous allons trier de la même manière que ci-dessus, sauf que nous devons gérer zéro! En production;
J'ai utilisé ce code pour forcer toutes les instances de mon tableau avec des valeurs de propriété nil à être en dernier. Ensuite, triez les métadonnées en utilisant les valeurs non encapsulées supposées.
Il est possible d'avoir un tri secondaire pour les options. Par exemple; on pourrait montrer des images avec des métadonnées et classées par taille.
la source
Deux alternatives
1) Commande du tableau d'origine avec sortInPlace
2) Utilisation d'un tableau alternatif pour stocker le tableau ordonné
la source
var assignmentsO : [Assignment]
ou de le combiner en une seule ligne en utilisantlet assignmentsO = self.assignments.sort({ $0.order < $1.order })
Swift 4.0, 4.1 & 4.2 Tout d'abord, j'ai créé un tableau mutable de type imageFile () comme indiqué ci-dessous
Créez une image objet mutable de type imageFile () et affectez une valeur aux propriétés comme indiqué ci-dessous
Maintenant, ajoutez cet objet au tableau arr
Maintenant, affectez les différentes propriétés au même objet mutable, c'est-à-dire l'image
Maintenant, ajoutez à nouveau l'objet image au tableau arr
Maintenant, nous allons appliquer l' ordre croissant sur la propriété fileId dans les objets tableau arr. Utilisez le symbole < pour l'ordre croissant
Maintenant, nous allons appliquer l' ordre décroissant sur la propriété fileId dans les objets tableau arr. Utilisez le symbole> pour l'ordre décroissant
Dans Swift 4.1. & 4.2 Pour une utilisation par ordre trié
la source
Si vous allez trier ce tableau à plusieurs endroits, il peut être judicieux de rendre votre type de tableau comparable.
la source
Si vous n'utilisez pas d'objets personnalisés, mais plutôt des types de valeur qui implémentent un protocole comparable (Int, String etc.), vous pouvez simplement le faire:
Un exemple:
la source
myArray.sorted(by: >)
Vous retournez un tableau trié à partir de la propriété fileID de la manière suivante:
Swift 2
Swift 3 OU 4
Swift 5.0
la source
Je le fais comme ça et ça marche:
var images = [imageFile]() images.sorted(by: {$0.fileID.compare($1.fileID) == .orderedAscending })
la source
Si vous souhaitez trier le tableau d'origine d'objets personnalisés. Voici une autre façon de le faire dans Swift 2.1
Où
id
est un entier. Vous pouvez également utiliser le même<
opérateur pour lesString
propriétés.Vous pouvez en savoir plus sur son utilisation en consultant un exemple ici: Swift2: Clients à proximité
la source
Tirages:
"["Peter", "Kweku", "Kofi", "Akosua", "Abena"]"
la source
Swift 3 & 4 & 5
J'ai eu un problème lié aux minuscules et aux majuscules
donc j'ai fait ce code
puis utilisez sortedImages après cela
la source
Trier à l'aide de KeyPath
vous pouvez trier
KeyPath
comme ceci:En implémentant cette petite extension utile.
Hope Swift ajoutera cela dans un avenir proche au cœur de la langue.
la source
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]) } }}