Jak mogę rozbroić / usunąć element z tablicy w nowym języku Apple Swift?
Oto kod:
let animals = ["cats", "dogs", "chimps", "moose"]
Jak można animals[2]
usunąć element z tablicy?
Słowo let
kluczowe służy do deklarowania stałych, których nie można zmienić. Jeśli chcesz zmodyfikować zmienną, powinieneś użyć var
zamiast niej, np .:
var animals = ["cats", "dogs", "chimps", "moose"]
animals.remove(at: 2) //["cats", "dogs", "moose"]
Nie mutującą alternatywą, która zachowa oryginalną kolekcję bez zmian, jest filter
utworzenie nowej kolekcji bez elementów, które chcesz usunąć, np .:
let pets = animals.filter { $0 != "chimps" }
remove
zwraca usunięty element:let animal = animals.remove(at: 2)
Dany
Usuń pierwszy element
Usuń ostatni element
Usuń element z indeksu
Usuń element o nieznanym indeksie
Tylko dla jednego elementu
Dla wielu elementów
Notatki
filter
) i zwracają usunięty element.dropFirst
lubdropLast
utworzyć nową tablicę.Zaktualizowano do Swift 5.2
źródło
chimps && moose
na przykład, aby usunąć ? Szukam czegoś innego niż{$0 != "chimps" && $0 != "moose"}
Powyższe odpowiedzi wydają się zakładać, że znasz indeks elementu, który chcesz usunąć.
Często znasz odniesienie do obiektu, który chcesz usunąć z tablicy. (Iterowałeś przez tablicę i ją znalazłeś, np.) W takich przypadkach może być łatwiej pracować bezpośrednio z odwołaniem do obiektu bez konieczności przekazywania wszędzie jego indeksu. Dlatego proponuję to rozwiązanie. Używa operatora tożsamości
!==
, którego używasz do testowania, czy oba odwołania do obiektów odnoszą się do tej samej instancji obiektu.Oczywiście to nie działa tylko dla
String
s.źródło
list = list.filter({ $0 != element })
array.indexOf({ $0 == obj })
list
tego usunięcia, nie zaktualizuje innych odwołań do tablicy, ponieważ przypisujesz nową tablicęlist
. Tylko subtelna implikacja, jeśli usuniesz z tablic za pomocą tego podejścia.Swift 5: Oto fajne i łatwe rozszerzenie do usuwania elementów z tablicy bez filtrowania:
Stosowanie :
Działa również z innymi typami, np.
Int
PonieważElement
jest to typ ogólny:źródło
W przypadku Swift4:
źródło
Począwszy od Xcode 10+ i zgodnie z sesją WWDC 2018 223 „Algorytmy obejmujące” dobrą metodą będzie
mutating func removeAll(where predicate: (Element) throws -> Bool) rethrows
Przykład Apple:
widzieć dokumentacja Apple
Tak więc w przykładzie PO usunięcie zwierząt [2], „szympansów”:
Ta metoda może być preferowana, ponieważ dobrze się skaluje (liniowa vs kwadratowa), jest czytelna i czysta. Pamiętaj, że działa tylko w Xcode 10+, a od momentu pisania jest w wersji beta.
źródło
Kilka operacji dotyczy tablicy w trybie Swift
Utwórz tablicę
Dodaj obiekt w szyku
Uzyskaj wartość z obiektu indeksu
Dołącz obiekt
Wstaw obiekt o indeksie
Usuń obiekt
Concat Wartość obiektu
źródło
Mógłbyś to zrobić. Najpierw upewnij się, że
Dog
naprawdę istnieje w tablicy, a następnie usuń ją. Dodajfor
instrukcję, jeśli uważasz, żeDog
może się zdarzyć więcej niż jeden raz na tablicy.Jeśli jesteś pewien, że
Dog
wychodzi z tablicy i zdarzyło się to tylko raz, zrób to:Jeśli masz zarówno ciągi, jak i liczby
źródło
Jeśli nie znasz indeksu elementu, który chcesz usunąć, a element jest zgodny z protokołem Equatable, możesz:
animals.removeAtIndex(animals.indexOf("dogs")!)
Zobacz odpowiedź na protokół Equatable: Jak zrobić indexOfObject lub odpowiedni zawieraObject
źródło
Usuń elementy za pomocą tablicy indeksów:
Tablica ciągów i indeksów
Tablica liczb całkowitych i indeksów
Usuń elementy, używając wartości elementu innej tablicy
Tablice liczb całkowitych
Tablice ciągów
źródło
Odnośnie alternatywy @ Suragch do „Usuń element o nieznanym indeksie”:
Istnieje mocniejsza wersja „indexOf (element)”, która będzie pasować do predykatu zamiast samego obiektu. Ma taką samą nazwę, ale jest wywoływana przez myObjects.indexOf {$ 0.property = valueToMatch}. Zwraca indeks pierwszego pasującego elementu znalezionego w tablicy myObjects.
Jeśli element jest obiektem / strukturą, możesz chcieć usunąć ten element na podstawie wartości jednej z jego właściwości. Na przykład masz klasę samochodów posiadającą właściwość car.color i chcesz usunąć „czerwony” samochód z tablicy carsArray.
Można było przewidzieć, że można to przerobić, aby usunąć „wszystkie” czerwone samochody, osadzając powyższą instrukcję if w pętli powtarzania / while i dołączając blok else, aby ustawić flagę „wyłamującą się” z pętli.
źródło
Szybki 5
źródło
Jeśli masz szereg obiektów niestandardowych, możesz wyszukiwać według określonych właściwości, takich jak:
lub jeśli chcesz na przykład wyszukać według nazwy
źródło
Powinno to zrobić (nie przetestowane):
Edycja: i musisz zrobić to, a
var
nielet
, w przeciwnym razie jest to niezmienna stała.źródło
Wymyśliłem następujące rozszerzenie, które zajmuje się usuwaniem elementów z
Array
, zakładając elementy wArray
narzędziuEquatable
:Stosowanie:
źródło
rozszerzenie do usunięcia obiektu String
źródło
Używam tego rozszerzenia, prawie takiego samego jak Varun, ale to (poniżej) jest uniwersalne:
źródło
Aby usunąć elementy z tablicy, użyj
remove(at:)
,removeLast()
iremoveAll()
.Usuń wartość z pozycji 2
Usuń ostatnią wartość z tablicy
Usuwa wszystkich członków z zestawu
źródło