Rechercher le premier élément de la condition de correspondance dans Swift array (par exemple EKSource)
J'aimerais trouver le premier EKSource
de type EKSourceType.Local
avec un "simple"de la ligne de l'expression en Swift. Voici ce que j'ai actuellement:
let eventSourceForLocal =
eventStore.sources[eventStore.sources.map({ $0.sourceType })
.indexOf(EKSourceType.Local)!]
Est-il une meilleure manière de faire ceci (comme sans de cartographie et/ou avec une version générique de find
)?
Vous devez vous connecter pour publier un commentaire.
Il y a une version de
indexOf
qui prend un prédicat de la fermeture de l'utiliser pour trouver l'index de la première source locale (si elle existe), et ensuite utiliser cet index sureventStore.sources
:Alternativement, vous pouvez ajouter un générique
find
méthode via une extension surSequenceType
:(Pourquoi n'est-ce pas là déjà?)
try
, fixe. Toutes les opérations de séquence permettra de consommer de la séquence (carte, contient, etc), donc je ne pense pas que c'est. indexOf fonctionne très bien, mais est limité aux collections.findFirst
parce que des thats un peu plus d'auto-documentation:)first(where:)
méthode sur des séquences qui fait juste cela.Alternativement dans Swift3, vous pouvez utiliser:
let local = eventStore.sources.first {$0.sourceType == .Local}
filter
puisfirst
est sous-optimale, parce qu'il oblige pire des cas den
temps de la complexité. Cela signifie que même lorsque vous avez trouvé l'élément, filtre va encore faire une boucle par le reste de la matrice.first(where:{})
les courts-circuits de la traversée et les pauses après il trouve la première occurrence.Je ne comprends pas pourquoi vous utilisez
map
à tous. Pourquoi ne pas utiliserfilter
? Vous aurez ensuite jusqu'à la fin avec toutes les sources locales, mais, en réalité, il n'y aura probablement qu'un seul, voire aucun, et vous pouvez facilement le trouver en posant pour la première (il seranil
si il n'y a pas un):let local = eventStore.sources.lazy.filter{$0.sourceType == .Local}.first
Swift 4 solution qui s'occupe également de la situation, quand il n'y a pas d'éléments dans votre tableau qui correspondent à votre état:
Essayons quelque chose de plus fonctionnel:
Ce qui est cool à ce sujet?
Vous obtenez l'accès à l'élément ou j'tandis que vous recherchez. Et il est fonctionnel.
Pour Swift 3, vous aurez besoin de faire quelques petits changements à Nate réponse ci-dessus. Voici la Swift 3 version:
Changements:
SequenceType
>Sequence
,Self.Generator.Element
>Iterator.Element