(Swift 3)
Vérifiez si un élément existe dans un tableau (remplissant certains critères), et si oui, continuez à travailler avec le premier élément de ce type
Si l'intention est:
- Pour vérifier si un élément existe dans un tableau (/ remplit certains critères booléens, pas nécessairement des tests d'égalité),
- Et si oui, continuez et travaillez avec le premier élément de ce type,
Alors une alternative à contains(_:)
as blueprinted Sequence
est first(where:)
de Sequence
:
let elements = [1, 2, 3, 4, 5]
if let firstSuchElement = elements.first(where: { $0 == 4 }) {
print(firstSuchElement) // 4
// ...
}
Dans cet exemple artificiel, son utilisation peut sembler stupide, mais il est très utile si vous interrogez des tableaux de types d'éléments non fondamentaux pour l'existence de tout élément remplissant une condition. Par exemple
struct Person {
let age: Int
let name: String
init(_ age: Int, _ name: String) {
self.age = age
self.name = name
}
}
let persons = [Person(17, "Fred"), Person(16, "Susan"),
Person(19, "Hannah"), Person(18, "Sarah"),
Person(23, "Sam"), Person(18, "Jane")]
if let eligableDriver = persons.first(where: { $0.age >= 18 }) {
print("\(eligableDriver.name) can possibly drive the rental car in Sweden.")
// ...
} // Hannah can possibly drive the rental car in Sweden.
let daniel = Person(18, "Daniel")
if let sameAgeAsDaniel = persons.first(where: { $0.age == daniel.age }) {
print("\(sameAgeAsDaniel.name) is the same age as \(daniel.name).")
// ...
} // Sarah is the same age as Daniel.
Toute opération chaînée utilisant .filter { ... some condition }.first
peut avantageusement être remplacée par first(where:)
. Ce dernier montre mieux l'intention et présente des avantages en termes de performances par rapport aux éventuels appareils non paresseux .filter
, car ceux-ci passeront le tableau complet avant d'extraire le premier élément (possible) passant le filtre.
Vérifiez si un élément existe dans un tableau (remplissant certains critères), et si oui, supprimez le premier élément de ce type
Un commentaire ci-dessous interroge:
Comment puis-je supprimer le firstSuchElement
du tableau?
Un cas d'utilisation similaire à celui ci-dessus consiste à supprimer le premier élément qui remplit un prédicat donné. Pour ce faire, la index(where:)
méthode de Collection
(qui est facilement disponible pour la collection de tableaux) peut être utilisée pour trouver l'index du premier élément remplissant le prédicat, après quoi l'index peut être utilisé avec la remove(at:)
méthode de Array
(possible; étant donné qu'il existe) supprimer cet élément.
var elements = ["a", "b", "c", "d", "e", "a", "b", "c"]
if let indexOfFirstSuchElement = elements.index(where: { $0 == "c" }) {
elements.remove(at: indexOfFirstSuchElement)
print(elements) // ["a", "b", "d", "e", "a", "b", "c"]
}
Ou, si vous souhaitez supprimer l'élément du tableau et travailler avec , appliquez la méthode Optional
: s map(_:)
à conditionnellement (pour le .some(...)
retour de index(where:)
) utiliser le résultat de index(where:)
pour supprimer et capturer l'élément supprimé du tableau (dans une clause de liaison facultative) .
var elements = ["a", "b", "c", "d", "e", "a", "b", "c"]
if let firstSuchElement = elements.index(where: { $0 == "c" })
.map({ elements.remove(at: $0) }) {
// if we enter here, the first such element have now been
// remove from the array
print(elements) // ["a", "b", "d", "e", "a", "b", "c"]
// and we may work with it
print(firstSuchElement) // c
}
Notez que dans l'exemple artificiel ci-dessus, les membres du tableau sont des types de valeur simples ( String
instances), donc l'utilisation d'un prédicat pour trouver un membre donné est quelque peu exagérée , car nous pourrions simplement tester l'égalité en utilisant la index(of:)
méthode la plus simple comme indiqué dans la réponse de @ DogCoffee . Person
Cependant, si vous appliquez l'approche find-and-remove ci-dessus à l' exemple, l'utilisation index(where:)
avec un prédicat est appropriée (puisque nous ne testons plus l'égalité mais pour remplir un prédicat fourni).
if find(elements, 5) != nil { }
n'est pas assez bon?