Jak w Swift mogę sprawdzić, czy element istnieje w tablicy? Xcode nie posiada żadnych sugestie contain
, include
albo has
i szybkie wyszukiwanie w książce pojawiło się nic. Masz pomysł, jak to sprawdzić? Wiem, że istnieje metoda, find
która zwraca numer indeksu, ale czy istnieje metoda, która zwraca wartość logiczną jak ruby #include?
?
Przykład tego, czego potrzebuję:
var elements = [1,2,3,4,5]
if elements.contains(5) {
//do something
}
if find(elements, 5) != nil { }
nie jest wystarczająco dobry?Odpowiedzi:
Swift 2, 3, 4, 5:
contains()
Jest to metoda rozszerzenie protokołu zSequenceType
(dla sekwencjiEquatable
elementów), a nie jako metoda globalna we wcześniejszych wydaniach.Uwagi:
contains()
metoda wymaga, aby elementy sekwencji przyjęłyEquatable
protokół, porównaj np . Odpowiedź Andrewsa .NSObject
podklasy, musisz przesłonićisEqual:
, patrz podklasa NSObject w Swift: hash vs hashValue, isEqual vs == .contains()
metoda, która nie wymaga, aby elementy były równoważne i przyjmuje predykat jako argument, patrz np. Skrót, aby sprawdzić, czy obiekt istnieje w tablicy dla Swift? .Szybkie starsze wersje:
źródło
Equatable
protokołem (coDictionary<String, AnyObject>
nie jest zgodne ). Istnieje drugi wariant,contains()
który bierze predykat (porównaj stackoverflow.com/questions/29679486/… ), być może możesz go użyć, np.if contains(array, { $0 == dict } ) ...
Dla tych, którzy tu przybyli w poszukiwaniu znalezienia i usunięcia obiektu z tablicy:
Szybki 1
Swift 2
Swift 3, 4, 5
źródło
Użyj tego rozszerzenia:
Użyj jako:
Zaktualizowano dla Swift 2/3
Zauważ, że od Swift 3 (lub nawet 2) rozszerzenie nie jest już konieczne, ponieważ
contains
funkcja globalna została przekształcona w parę metod rozszerzeniaArray
, które umożliwiają wykonanie jednej z następujących czynności:źródło
Jeśli sprawdzasz, czy wystąpienie niestandardowej klasy lub struktury jest zawarte w tablicy, musisz zaimplementować protokół Equatable , zanim będziesz mógł użyć .contains (myObject).
Na przykład:
wtedy możesz zrobić:
Wskazówka : Przesłonięcie == powinno być na poziomie globalnym, a nie w twojej klasie / strukturze
źródło
Użyłem filtra.
Jeśli chcesz, możesz to skompresować
Mam nadzieję, że to pomaga.
Aktualizacja dla Swift 2
Hurra na domyślne implementacje!
źródło
(Swift 3)
Sprawdź, czy element istnieje w tablicy (spełniając pewne kryteria), a jeśli tak, kontynuuj pracę z pierwszym takim elementem
Jeśli celem jest:
Wtedy alternatywą
contains(_:)
jako blueprintedSequence
jestfirst(where:)
odSequence
:W tym wymyślonym przykładzie jego użycie może wydawać się głupie, ale jest to bardzo przydatne, jeśli zapytanie o tablice nie fundamentalnych typów elementów o istnienie dowolnego elementu spełniającego jakiś warunek. Na przykład
Wszelkie powiązane operacje przy użyciu
.filter { ... some condition }.first
można korzystnie zastąpićfirst(where:)
. Ta ostatnia pokazuje zamiar lepiej i ma przewagę wydajności w stosunku do możliwych nie leniwych urządzeń.filter
, ponieważ przejdą one pełną tablicę przed wyodrębnieniem (możliwego) pierwszego elementu przechodzącego przez filtr.Sprawdź, czy element istnieje w tablicy (spełniając pewne kryteria), a jeśli tak, usuń pierwszy taki element
Komentarz poniżej zapytań:
Podobny przypadek zastosowania do powyższego dotyczy usunięcia pierwszego elementu, który spełnia dany predykat. Aby to zrobić, można zastosować
index(where:)
metodęCollection
(która jest łatwo dostępna w kolekcji tablic) w celu znalezienia indeksu pierwszego elementu spełniającego predykat, po czym indeks można zastosować za pomocąremove(at:)
metodyArray
to (możliwe; pod warunkiem, że istnieje) usuń ten element.Lub, jeśli chcesz usunąć element z tablicy i pracować z nim , zastosuj metodę
Optional
: smap(_:)
, aby warunkowo (do.some(...)
zwrotu zindex(where:)
) użyć wyniku zindex(where:)
do usunięcia i przechwycenia usuniętego elementu z tablicy (w ramach opcjonalnej klauzuli wiążącej) .Zauważ, że w powyższym skonstruowanym przykładzie elementy tablicy są prostymi typami wartości (
String
instancjami), więc użycie predykatu w celu znalezienia danego elementu jest nieco przesadzone , ponieważ możemy po prostu przetestować równość przy użyciu prostszejindex(of:)
metody, jak pokazano w odpowiedzi @ DogCoffee .Person
Jednak w przypadku zastosowania powyższego przykładu w znajdowaniu i usuwaniuindex(where:)
właściwe jest używanie z predykatem (ponieważ nie testujemy już równości, ale spełniamy podany predykat).źródło
Najprostszym sposobem na osiągnięcie tego jest użycie filtru na tablicy.
result
będzie miał znaleziony element, jeśli istnieje i będzie pusty, jeśli element nie istnieje. Zatem sprawdzenie, czyresult
jest puste, powie ci, czy element istnieje w tablicy. Użyłbym następujących:źródło
let result = elements.filter { $0==5 }.first
powinno osiągnąć to, czego szukasz.Swift 4/5
Innym sposobem na osiągnięcie tego jest funkcja filtrowania
źródło
Od wersji Swift 2.1 NSArrays
containsObject
można ich używać w następujący sposób:źródło
Tylko w przypadku, ktoś próbuje znaleźć jeśli
indexPath
jest między wybranymi (jak w sposóbUICollectionView
lubUITableView
cellForItemAtIndexPath
funkcji):źródło
Szyk
Sprawdź obecność elementów
Pobierz indeks elementów
Uzyskaj liczbę elementów
źródło
Oto moje małe rozszerzenie, które właśnie napisałem, aby sprawdzić, czy moja tablica delegatów zawiera obiekt delegowany, czy nie ( Swift 2 ). :) Działa również z typami wartości, takimi jak urok.
Jeśli masz pomysł, jak zoptymalizować ten kod, daj mi znać.
źródło
jeśli użytkownik znajdzie określone elementy tablicy, użyj poniższego kodu jako wartości całkowitej.
źródło
Szybki
Jeśli nie używasz obiektu, możesz użyć tego kodu dla zawiera.
Jeśli używasz NSObject Class w trybie szybkim. Te zmienne są zgodne z moimi wymaganiami. możesz zmodyfikować według własnych wymagań.
Dotyczy to tego samego typu danych.
Jeśli chcesz wpisać AnyObject.
Pełny stan
źródło
co powiesz na użycie tabeli skrótów dla tego zadania?
po pierwsze, utworzenie ogólnej funkcji „mapy skrótów”, rozszerzającej protokół sekwencji.
To rozszerzenie będzie działać, dopóki elementy w tablicy będą zgodne z Hashable, takie jak liczby całkowite lub ciągi, oto użycie ...
Ale na razie skupmy się na sprawdzeniu, czy element znajduje się w tablicy.
źródło
Swift 4.2 +
Za pomocą poniższej funkcji możesz łatwo sprawdzić, czy instancja jest tablicą.
Nawet ty możesz uzyskać do niego dostęp w następujący sposób. Otrzymasz,
nil
jeśli obiekt nie będzie tablicą.źródło