Próbuję znaleźć item index
, wyszukująclist
. Czy ktoś wie jak to zrobić?
Widzę tam jest list.StartIndex
, a list.EndIndex
jednak chcę coś takiego Pythona list.index("text")
.
Ponieważ szybkie jest pod pewnymi względami bardziej funkcjonalne niż obiektowe (a tablice są strukturami, a nie obiektami), użyj funkcji „znajdź”, aby operować na tablicy, która zwraca wartość opcjonalną, więc przygotuj się na obsługę wartości zerowej:
let arr:Array = ["a","b","c"]
find(arr, "c")! // 2
find(arr, "d") // nil
Aktualizacja dla Swift 2.0:
Stara find
funkcja nie jest już obsługiwana w Swift 2.0!
Dzięki Swift 2.0 Array
zyskuje możliwość znalezienia indeksu elementu za pomocą funkcji zdefiniowanej w rozszerzeniu CollectionType
(który Array
implementuje):
let arr = ["a","b","c"]
let indexOfA = arr.indexOf("a") // 0
let indexOfB = arr.indexOf("b") // 1
let indexOfD = arr.indexOf("d") // nil
Ponadto znalezienie pierwszego elementu w tablicy spełniającej predykat jest obsługiwane przez inne rozszerzenie CollectionType
:
let arr2 = [1,2,3,4,5,6,7,8,9,10]
let indexOfFirstGreaterThanFive = arr2.indexOf({$0 > 5}) // 5
let indexOfFirstGreaterThanOneHundred = arr2.indexOf({$0 > 100}) // nil
Zauważ, że te dwie funkcje zwracają wartości opcjonalne, tak find
jak wcześniej.
Aktualizacja dla Swift 3.0:
Uwaga: zmieniono składnię indexOf. Do przedmiotów zgodnych Equatable
możesz użyć:
let indexOfA = arr.index(of: "a")
Szczegółowa dokumentacja metody znajduje się na stronie https://developer.apple.com/reference/swift/array/1689674-index
W przypadku elementów tablicy, które nie są zgodne Equatable
, musisz użyć index(where:)
:
let index = cells.index(where: { (item) -> Bool in
item.foo == 42 // test if this is the item you're looking for
})
Aktualizacja dla Swift 4.2:
W Swift 4.2 index
nie jest już używany, ale jest podzielony na firstIndex
i lastIndex
dla lepszego wyjaśnienia. W zależności od tego, czy szukasz pierwszego czy ostatniego indeksu przedmiotu:
let arr = ["a","b","c","a"]
let indexOfA = arr.firstIndex(of: "a") // 0
let indexOfB = arr.lastIndex(of: "a") // 3
indexOf
z tablicy struktur, które sam zdefiniowałeś, Twoja struktura musi być zgodna zEquatable
protokołem.tl; dr:
Na zajęcia możesz szukać:
Pełna odpowiedź:
Myślę, że warto wspomnieć, że w przypadku typów referencyjnych (
class
) można wykonać porównanie tożsamości , w takim przypadku wystarczy użyć===
operatora tożsamości w zamknięciu predykatu:Swift 5, Swift 4.2:
Zauważ, że powyższa składnia używa końcowej składni zamknięć i jest równoważna z:
Swift 4 / Swift 3 - wywoływana funkcja
index
Swift 2 - wywoływana funkcja
indexOf
* Zwróć uwagę na odpowiedni i użyteczny komentarz autorstwa paulbailey na temat
class
typów, które się implementująEquatable
, gdzie musisz rozważyć, czy powinieneś porównywać używając===
( operator tożsamości ) czy==
( operator równości ). Jeśli zdecydujesz się dopasować za pomocą==
, możesz po prostu użyć metody sugerowanej przez innych (people.firstIndex(of: person1)
).źródło
Person
zaimplementowaniaEquatable
protokołu nie byłoby to konieczne.Binary operator '===' cannot be applied to operands of type '_' and 'Post'
,Post
moja struct ... jakiś pomysł?structs
(ienums
) są typami wartości, a nie typami referencyjnymi. Tylko typy referencyjne (np.class
) Mają logikę porównywania tożsamości (===
). Sprawdź inne odpowiedzi, aby dowiedzieć się, co z tym zrobićstructs
(w zasadzie po prostu używaszarray.index(of: myStruct)
, upewniając się, że typmyStruct
jest zgodny zEquatable
(==
)).Możesz
filter
tablicę z zamknięciem:I możesz policzyć tablicę:
Możesz więc ustalić, czy tablica zawiera Twój element, łącząc te:
Jeśli chcesz znaleźć pozycję, nie widzę wymyślnego sposobu, ale na pewno możesz to zrobić w następujący sposób:
EDYTOWAĆ
Skoro już to robimy, dla zabawy wykonajmy
Array
jeszcze jednąfind
metodę:Teraz możemy to zrobić:
źródło
Array
aby miećfind
metodę, która robi to, co chcesz. Nie wiem jeszcze, czy to dobra praktyka, ale to fajny eksperyment.enumerate
nie był już stosowany, ale masz całkowitą rację.Szybki 5
Przykład 1
Przykład 2
źródło
Chociaż
indexOf()
działa idealnie, zwraca tylko jeden indeks.Szukałem eleganckiego sposobu na uzyskanie tablicy indeksów dla elementów, które spełniają pewne warunki.
Oto jak to zrobić:
Swift 3:
Swift 2:
źródło
W przypadku klasy niestandardowej należy zaimplementować protokół Equatable.
źródło
Aktualizacja dla Swift 2:
Swift 1:
Jeśli chcesz tylko sprawdzić, czy element jest zawarty w tablicy, to po prostu weź wskaźnik boolean, użyj
contains(sequence, element)
zamiastfind(array, element)
:Zobacz przykład poniżej:
źródło
w Swift 4.2
.index (gdzie :) został zmieniony na .firstIndex (gdzie :)
źródło
Swift 4. Jeśli tablica zawiera elementy typu [String: AnyObject]. Aby znaleźć indeks elementu, użyj poniższego kodu
Lub Jeśli chcesz znaleźć indeks na podstawie klucza ze słownika. Tutaj tablica zawiera obiekty klasy Model i dopasowuję właściwość id.
źródło
Swift 2.1
Szybki 3
źródło
let array
? Zastosowanieself
jest również wątpliwe.W Swift 4 , jeśli przemierzasz tablicę DataModel, upewnij się, że Twój model danych jest zgodny z protokołem Equatable, zaimplementuj metodę lhs = rhs, a dopiero potem możesz użyć „.index (z”. Na przykład
I wtedy,
źródło
W Swift 2 (z Xcode 7)
Array
zawieraindexOf
metodę dostarczoną przezCollectionType
protokół. (Właściwie dwieindexOf
metody - jedna używa równości w celu dopasowania argumentu, a druga używa zamknięcia.)Przed wersją Swift 2 typy ogólne, takie jak kolekcje, nie zapewniały metod dla konkretnych typów pochodnych (takich jak tablice). Tak więc w Swift 1.x „indeks” jest funkcją globalną… I również zmieniono jego nazwę, więc w Swift 1.x ta funkcja globalna nazywa się
find
.Możliwe jest również (ale nie konieczne) użycie
indexOfObject
metody zNSArray
... lub dowolnej innej, bardziej wyrafinowanej metody wyszukiwania z Foundation, która nie ma odpowiedników w standardowej bibliotece Swift. Po prostuimport Foundation
(lub inny moduł, który tranzytowo importuje Foundation), prześlij swójArray
naNSArray
, i możesz korzystać z wielu metod wyszukiwaniaNSArray
.źródło
Każde z tych rozwiązań działa dla mnie
To rozwiązanie mam dla Swift 4:
źródło
Możesz także użyć biblioteki funkcjonalnej Dollar do wykonania indeksu dla tablicy jako takiej http://www.dollarswift.org/#indexof-indexof
źródło
Jeśli nadal pracujesz w Swift 1.x
więc spróbuj,
źródło
W SWIFT 3 możesz użyć prostej funkcji
To da numer pozycji, więc możesz użyć like
Mam nadzieję, że się przydadzę
źródło
SWIFT 4
Załóżmy, że chcesz zapisać liczbę z tablicy o nazwie cardButtons w cardNumber, możesz to zrobić w ten sposób:
nadawca to nazwa twojego przycisku
źródło
Szybki 4
Dla typów referencyjnych:
źródło
W Swift 4/5 użyj „firstIndex” do znalezienia indeksu.
źródło
W przypadku, gdy ktoś ma ten problem
jsut zrób to
następnie
źródło
Dla
(>= swift 4.0)
To raczej bardzo proste. Rozważ następujący
Array
obiekt.Aby uzyskać indeks elementu
rose
, wystarczy:Uwaga:
Array.index(of:)
zwraca anOptional<Int>
.nil
oznacza, że element nie jest obecny w tablicy.Możesz wymusić rozpakowanie zwróconej wartości lub użyć opcji,
if-let
aby obejść opcję opcjonalną.źródło
Wystarczy użyć metody firstIndex.
źródło