Mam tablicę, która składa się z AnyObject
. Chcę iterować i znaleźć wszystkie elementy, które są instancjami tablicowymi.
Jak mogę sprawdzić, czy obiekt jest danego typu w Swift?
swift
type-inference
typechecking
Bis PTL
źródło
źródło
Odpowiedzi:
Jeśli chcesz sprawdzić konkretny typ, możesz wykonać następujące czynności:
Możesz użyć „jak!” i spowoduje to błąd w czasie wykonywania, jeśli
obj
nie jest typu[String]
Możesz również sprawdzić jeden element na raz:
źródło
?
nie jest obecny. To brzmi jakas
i?
po połączeniu wykona kontrolę czasu wykonywania. Kiedy byłoby właściwe używaćas
bez?
? Z góry dziękuję.as
bez?
jeśli nie ma sposobu, Twój program może odzyskać przedmiot nie jest tego rodzaju, ponieważ program będzie natychmiast zatrzymać, jeśli tak nie jest. Użycie instrukcji?
inif
pozwala kontynuować program.?
w tym przypadku spowoduje sprawdzenie typu „ogólnego”, jeśli tak, do klauzuli if, jeśli nie, do klauzuli else. Bez tego?
nigdy nie zostałby wprowadzony i, jak wskazałeś, powoduje błąd w czasie wykonywania. Dzięki jeszcze raz.?
Umożliwia przypisanie do powrotunil
powodując if do zwrotufalse
, a więc spada aż do innego rachunku. Myślę jednak, że wyjaśnienie to pomaga w zrozumieniu, aleif let
tak naprawdę jest szczególnym przypadkiem w kompilatorzeW Swift 2.2 - 5 możesz teraz:
Następnie, aby przefiltrować tablicę:
Jeśli masz wiele typów do sprawdzenia:
źródło
object
jakoString
nawiasów klamrowych (przynajmniej w Swift 2), podczas gdy wlet
rozwiązaniu można to zrobić.object
w bloku jest w porządku.object.uppercaseString
ponieważ typ zmiennej nie jest rzutowany na ten typ, po prostu sprawdziłeś, że obiekt (wskazany przez zmienną) toString
Jeśli chcesz tylko wiedzieć, czy obiekt jest podtypem danego typu, istnieje prostsze podejście:
„Użyj operatora sprawdzania typu (is), aby sprawdzić, czy instancja jest określonego typu podklasy. Operator sprawdzania typu zwraca true, jeśli instancja jest tego typu podklasy, a false, jeśli nie jest. Fragment: Apple Inc. „Swift Programming Language”. iBooks .
W powyższym znaczeniu ważne jest wyrażenie „określonego typu podklasy”. Kompilator akceptuje użycie
is Circle
i,is Rectangle
ponieważ ta wartośćshape
jest zadeklarowana jakoShape
(nadklasaCircle
iRectangle
).Jeśli używasz typów pierwotnych, nadklasą byłoby
Any
. Oto przykład:źródło
is
nadal by tu działał? Dzięki.object
jakoAny
. Zaktualizowano z przykładem.AnyObject
jest sugerowana, wydaje się, że została odparta z powoduAnyObject
braku dziedziczeniaNSObject
. JeśliAny
jest inaczej, byłoby to również świetne rozwiązanie. Dzięki.Mam na to 2 sposoby:
Lub:
Oto szczegółowy przykład:
Edytuj: 3 teraz:
źródło
isKindOfClass
jest metodąNSObject
protokołu; powinno działać tylko dla klas, które przyjmują ją (wszystkie klasy zstępującego z NSObject oraz wszelkie niestandardowe klasy Swift że Przyjmuje jawnie)dla swift4:
źródło
Załóżmy, że drawTriangle jest instancją UIView. Aby sprawdzić, czy drawTriangle jest typu UITableView:
W Swift 3 ,
Można to również wykorzystać do klas zdefiniowanych przez ciebie. Możesz użyć tego do sprawdzenia widoków podrzędnych widoku.
źródło
Dlaczego nie skorzystać z wbudowanej funkcjonalności stworzonej specjalnie do tego zadania?
źródło
Ostrzegam o tym:
Wszystkie cztery ostatnie wiersze zwracają wartość true, ponieważ po wpisaniu
... drukuje „fałsz” oczywiście, ale Ostrzeżenie mówi, że rzutowanie z CGRect na ciąg nie powiedzie się. Więc niektóre typy są zmostkowane, a słowo kluczowe „is” wywołuje niejawną rzutowanie.
Lepiej użyj jednego z tych:
źródło
Jeśli chcesz tylko sprawdzić klasę bez ostrzeżenia z powodu nieużywanej zdefiniowanej wartości (niech someVariable ...), możesz po prostu zastąpić let przez boolean:
Xcode zaproponował to, gdy użyłem let let i nie użyłem zdefiniowanej wartości.
źródło
Dlaczego nie skorzystać z czegoś takiego?
w Swift 3.
źródło
Swift 4.2, w moim przypadku przy użyciu funkcji isKind.
Czytaj więcej https://developer.apple.com/documentation/objectivec/nsobjectprotocol/1418511-iskind
źródło
myObject as? String
zwraca,nil
jeślimyObject
nie jestString
. W przeciwnym razie zwraca aString?
, dzięki czemu można uzyskać dostęp do samego ciągu za pomocąmyObject!
lubmyObject! as String
bezpiecznie rzucić go .źródło
Swift 3:
źródło
Dla kompletności opartej na przyjętej odpowiedzi i kilku innych:
Ale możesz także (
compactMap
również „mapować” wartości, którefilter
nie):I wersja wykorzystująca
switch
:Ale pozostając przy pytaniu, aby sprawdzić, czy jest to tablica (tj.
[String]
):Lub bardziej ogólnie (patrz ta inna odpowiedź na pytanie ):
źródło
as?
nie zawsze da oczekiwany wynik, ponieważas
nie sprawdza, czy typ danych jest określonego rodzaju, ale tylko wtedy, gdy typ danych można przekonwertować na lub reprezentować jako określony rodzaj.Rozważ ten kod na przykład:
Każdy typ danych zgodny z
Error
protokołem można przekonwertować naNSError
obiekt, więc zawsze się to powiedzie . Nie oznacza to jednak, żeerror
jest to w rzeczywistościNSError
przedmiot lub jego podklasa.Prawidłowa kontrola typu to:
Sprawdza to jednak tylko dokładny typ. Jeśli chcesz również dołączyć podklasę
NSError
, powinieneś użyć:źródło
Jeśli masz taką odpowiedź:
i chcesz sprawdzić wartość,
is_stucked
która zostanie odczytana jako AnyObject, wszystko co musisz zrobić, to toźródło
Jeśli nie wiesz, że w odpowiedzi z serwera otrzymasz tablicę słowników lub pojedynczy słownik, musisz sprawdzić, czy wynik zawiera tablicę, czy nie.
W moim przypadku zawsze otrzymuję szereg słowników, z wyjątkiem jednego. Aby to obsłużyć, użyłem poniższego kodu do szybkiego 3.
Tutaj jak? Tablica sprawdza, czy uzyskana wartość jest tablicą (elementów słownika). W innym przypadku możesz sobie poradzić, jeśli jest to pojedynczy element słownika, który nie jest przechowywany w tablicy.
źródło
Wersja Swift 5.2 i Xcode: 11.3.1 (11C504)
Oto moje rozwiązanie sprawdzania typu danych:
Mam nadzieję, że ci to pomoże.
źródło