Czy Swift ma coś takiego jak _.findWhere w Underscore.js?
Mam tablicę struktur typu T
i chciałbym sprawdzić, czy tablica zawiera obiekt struct, którego name
właściwość jest równa Foo
.
Próbował użyć find()
i filter()
ale tylko pracę z prymitywnych typów, np String
lub Int
. Zgłasza błąd o niezgodności z Equitable
protokołem lub coś w tym rodzaju.
Odpowiedzi:
FWIW, jeśli nie chcesz używać niestandardowej funkcji lub rozszerzenia, możesz:
To generuje
name
najpierw tablicę, a następniefind
z niej.Jeśli masz ogromną tablicę, możesz to zrobić:
albo może:
źródło
SWIFT 5
Sprawdź, czy element istnieje
Zdobądź element
Pobierz element i jego przesunięcie
Uzyskaj wyrównanie
źródło
$0.name == "foo"
zrobić jedną operację i$0.name == "boo"
zrobić kolejną operacjęMożesz użyć
index
metody dostępnej wArray
predykacie ( zobacz dokumentację Apple tutaj ).Dla twojego konkretnego przykładu będzie to:
Swift 5.0
Swift 3.0
Swift 2.0
źródło
Szybki 3
Jeśli potrzebujesz obiektu użyj:
(Jeśli masz więcej niż jeden obiekt o nazwie „Foo”
first
, zwróci pierwszy obiekt z nieokreślonej kolejności)źródło
array.first {$0.name == "Foo"}
array.first(where: {$0.name == "Foo"})
Możesz przefiltrować tablicę, a następnie po prostu wybrać pierwszy element, jak pokazano w Znajdź obiekt z właściwością w tablicy .
Możesz też zdefiniować rozszerzenie niestandardowe
Przykład użycia:
W Swift 3 możesz użyć istniejącej
first(where:)
metody (jak wspomniano w komentarzu ):źródło
array.lazy.filter( predicate ).first
? Jak wydajne jest .lazy w przypadku małych tablic?filter
jest zawsze,O(n)
podczas gdy w przypadkufindFirstMatching
jest to tylko w najgorszym scenariuszu (gdy element, którego szukasz, jest ostatnim w tablicy lub nie ma go wcale). 2.filter
tworzy zupełnie nową tablicę przefiltrowanych elementów, podczas gdy tenfindFirstMatching
właśnie zwraca żądany element.Swift 3.0
Swift 2.1
Filtrowanie we właściwościach obiektu jest teraz obsługiwane w Swift 2.1. Możesz filtrować swoją tablicę na podstawie dowolnej wartości struktury lub klasy. Oto przykład
LUB
źródło
Szybki 4 ,
Inny sposób na osiągnięcie tego za pomocą funkcji filtra,
źródło
Szybki 3
możesz użyć indeksu (gdzie :) w Swift 3
przykład
źródło
$0.name == "Foo"
?Szybki 3
źródło
Swift 2 lub nowszy
Możesz łączyć
indexOf
imap
pisać funkcję „znajdź element” w jednym wierszu.Używanie
filter
+first
wygląda czyściej, alefilter
ocenia wszystkie elementy tablicy.indexOf
+map
wygląda na skomplikowane, ale ocena kończy się, gdy zostanie znalezione pierwsze dopasowanie w tablicy. Oba podejścia mają zalety i wady.źródło
Zastosowanie
contains
:Możesz też wypróbować to, na co wskazał cię Martin, w komentarzach i
filter
spróbować jeszcze raz: Znajdź obiekt z właściwością w tablicy .źródło
item
jest tego samego typu co element tablicy. Jednak mam tylko tytuł zview.annotation.title
. Muszę porównać elementy w tablicy według tego tytułu.if contains(yourArray, view.annotation.title) { // code goes here }
.Innym sposobem uzyskania dostępu do array.index (of: Any) jest zadeklarowanie obiektu
źródło
Użyj Dollar, którym jest Lo-Dash lub Underscore.js dla Swift:
źródło
Swift 3:
Możesz użyć wbudowanej funkcji jerzyków, aby znaleźć niestandardowe obiekty w tablicy.
Najpierw musisz upewnić się, że Twój obiekt niestandardowy jest zgodny z protokołem : Equatable .
Po dodaniu funkcji Equatable do Twojego obiektu Swift pokaże Ci dodatkowe właściwości, których możesz użyć w tablicy:
źródło
Dla Swift 3,
źródło
Na przykład, gdybyśmy mieli tablicę liczb:
Możemy znaleźć pierwszą liczbę nieparzystą w ten sposób:
To zwróci 4 jako opcjonalną liczbę całkowitą, ponieważ pierwsza liczba nieparzysta (9) ma indeks czwarty.
źródło