Mam tę pętlę for-in:
for button in view.subviews {
}
Teraz chcę, aby przycisk został rzutowany na klasę niestandardową, aby móc użyć jego właściwości.
Próbowałem tego: for button in view.subviews as AClass
Ale to nie działa i wyświetla mi błąd:'AClass' does not conform to protocol 'SequenceType'
I spróbowałem tego: for button:AClass in view.subviews
Ale to też nie działa.
for-loop
swift
for-in-loop
Arbitur
źródło
źródło
for button in view.subviews as [AClass]
Odpowiedzi:
Dla Swift 2 i nowszych:
Swift 2 dodaje wzory przypadków do pętli for , dzięki czemu wpisywanie rzutów w pętli for jest jeszcze łatwiejsze i bezpieczniejsze :
Dlaczego jest to lepsze niż to, co można było zrobić w wersji Swift 1.2 i wcześniejszych? Ponieważ wzory kopert pozwalają na wybranie konkretnego typu z kolekcji. Pasuje tylko do typu, którego szukasz, więc jeśli twoja tablica zawiera mieszaninę, możesz operować tylko na określonym typie.
Na przykład:
Wynik:
Dla Swift 1.2 :
W tym przypadku rzutujesz,
view.subviews
a niebutton
, więc musisz obniżyć go do tablicy odpowiedniego typu:Uwaga: jeśli podstawowy typ tablicy nie jest
[AClass]
, to się zawiesi. To, co!
onas!
ci mówi. Jeśli nie masz pewności co do typu, możesz użyć rzutowania warunkowegoas?
wraz z opcjonalnym wiązaniemif let
:Dla Swift 1.1 i starszych:
Uwaga: spowoduje to również awarię, jeśli podglądy nie są wszystkich typów
AClass
. Wymieniona powyżej bezpieczna metoda działa również z wcześniejszymi wersjami języka Swift.źródło
[ ]
nawiasach dokładnie tak, jak w tym przykładzie. Może to tylko ja, ale na początku pomyślałem, że to tylko wybór formatowania w przykładowym kodzie :) Zakładam, że dzieje się tak dlatego, że rzutujemy na tablicę.[Class]
wygląda znacznie lepiej niżArray<Class>
.Ta opcja jest bezpieczniejsza:
lub szybki sposób:
źródło
Możesz także użyć
where
klauzuliźródło
button
wewnątrz treści pętli, co jest celem innych rozwiązań. Więc to uruchomi treść pętli tylko na elementach,view.subviews
których sąUIButton
s, ale nie pomoże np. W wywołaniuAClass
metod specyficznych dlabutton
.where
tylko strzeże i nie rzuca.where
może być bardziej elegancki i czytelny w przypadkach (niezamierzona gra słów), w których potrzebujesz tylko boolowskiego strażnika.Podane odpowiedzi są poprawne, chciałem tylko dodać to jako dodatek.
Podczas używania pętli for z rzutowaniem wymuszonym kod ulegnie awarii (jak już wspominali inni).
Ale zamiast używać klauzuli if,
innym sposobem jest użycie pętli while:
Co wydaje się być wygodniejsze, jeśli niektóre elementy (ale nie wszystkie) tablicy mogą być typu
AClass
.Chociaż na razie (od Swift 5) wybrałbym pętlę for-case:
źródło
Odpowiedź udzielona przez vacawama była poprawna w Swift 1.0. I nie działa już ze Swift 2.0.
Jeśli spróbujesz, pojawi się błąd podobny do:
W Swift 2.0 musisz pisać tak:
źródło
Możesz wykonać rzut i jednocześnie być bezpiecznym:
źródło