Istnieje metoda -[NSObject conformsToProtocol:]
w celu sprawdzenia, czy określony protokół został przyjęty, czy nie. Czy istnieje jakaś metoda uzyskania wszystkich przyjętych protokołów dla danej klasy, zamiast sprawdzania listy?Czy istnieje metoda introspekcji, aby uzyskać wszystkie przyjęte protokoły dla klasy w Objective-C?
Czy istnieje metoda introspekcji, aby uzyskać wszystkie przyjęte protokoły dla klasy w Objective-C?
Odpowiedz
Jest bardziej eleganckie rozwiązanie: class_copyProtocolList()
bezpośrednio zwraca przyjęte protokoły klasy. Użycie:
Class cls = [self class]; // or [NSArray class], etc.
unsigned count;
Protocol **pl = class_copyProtocolList(cls, &count);
for (unsigned i = 0; i < count; i++) {
NSLog(@"Class %@ implements protocol <%s>", cls, protocol_getName(pl[i]));
}
free(pl);
Należy pamiętać, że ta lista nie zawiera protokołów adoptowanych przez nadklasy, więc - w zależności od tego, do czego jest używana ta lista - konieczne może być przejście do łańcucha nadklasowego i ponowne wywołanie metody class_copyProtocolList(). –
@MartinR Dokładnie, naprawdę ciężko mi było dowiedzieć się dlaczego to nie wymienia protokołów dla 'NSMutableDictionary' ... –
jest to świetna odpowiedź. Wszystko działało dobrze. Może nie działać z ARC. ale na pewno będzie działać bez ARC. Dzięki. –
Można spróbować objc_copyProtocolList
Tj otrzymasz listę wszystkich protokołów, a następnie sprawdź, czy bieżący obiekt jest zgodny z określonym protokołem przez iterowanie listy.
Edit:
H2CO3 rozwiązanie jest naprawdę lepszy
Lub 'class_copyProtocolList()'. –
Jak praktycznie z niego korzystać? –
Masz na myśli, że powinienem napisać kod? – Max
Jest dokładnie NSObject +conformsToProtocol
; Zgodność protokołu jest zadeklarowana jako część @interface
, więc nie jest specyficzna dla każdej instancji. Np.
if([[self class] conformsToProtocol:@protocol(UIScrollViewDelegate)])
NSLog(@"I claim to conform to UIScrollViewDelegate");
Nie trzeba w ogóle rezygnować z metod uruchomieniowych poziomu C, przynajmniej dla pierwszej części pytania. Nie ma nic w NSObject
, aby uzyskać listę obsługiwanych protokołów.
- 1. Składnia ObjectiveC do określania nazwy protokołu w argumencie Metoda Argumenty
- 2. Czy można uzyskać wszystkie prawidłowe metody dla konkretnej klasy Perla?
- 3. Czy można uzyskać wszystkie podklasy klasy?
- 4. W maszynopisie: Czy istnieje sposób "kompilacji", aby uzyskać wszystkie nazwy właściwości zdefiniowane w interfejsie TypeScript?
- 5. Czy czas wywołania metody super klasy jest ważny w ObjectiveC?
- 6. Czy istnieje sposób na zawinięcie bloku ObjectiveC do wskaźnika funkcji?
- 7. Czy istnieje sposób, aby Zwiń wszystkie pola json w Postman
- 8. Czy istnieje ogólna alternatywa dla klasy ListDictionary?
- 9. Czy istnieje metoda antyaliasingu dla Pythona PIL?
- 10. Wpływają na to protokoły Clojure'a?
- 11. Czy istnieje heurystyka, aby określić, czy dana metoda lub pole należy do klasy?
- 12. Zastępowanie metoda __contains__ dla klasy
- 13. Czy istnieje sposób, aby wstępnie ustalić klasy zagnieżdżone w C++?
- 14. Czy istnieje sposób, aby klasy pochodne zastąpić ToString()?
- 15. Jak uzyskać wszystkie klasy sun.font w jdk9
- 16. Czy istnieje sposób, aby wyświetlić wszystkie trasy na serwerze Hapi
- 17. Java8: Czy istnieje sposób, aby uzyskać odwołanie do metody instancji z odwołania do metody klasy?
- 18. Czy istnieje odpowiednik klasy Semantic dla klasy Bootstrap .container?
- 19. Czy istnieje sposób, aby uzyskać xml Exlement przez atrybut?
- 20. Ścieżka: Czy istnieje sposób, aby uzyskać wszystkie dzieci tekstu w xpath
- 21. Czy istnieje sposób, aby zabronić podklasy mojej klasy?
- 22. Czy istnieje metoda "upto" w języku C#?
- 23. Metoda skanera, aby uzyskać znak zapytania
- 24. Czy istnieje jakakolwiek metoda na znalezienie zmienionych atrybutów dla obiektów?
- 25. Czy istnieje metoda pomocnika dla pluralizacji w Railsach?
- 26. Czy istnieje sposób, aby posłuchać innej metody klasy?
- 27. Czy istnieje wbudowana metoda w RoR, aby wypełnić zero dla liczby całkowitej?
- 28. Czy metoda rezygnuje z klasy AuthorizeAttribute na poziomie klasy?
- 29. Czy istnieje funkcja w języku Java, aby uzyskać średnią ruchomą
- 30. Jak sprawdzić, czy metoda istnieje w środowisku wykonawczym w Javie?
Co dokładnie próbujesz osiągnąć z tym? –
@ RichardJ.RossIII Często używałem protokołu, gdzie potrzebuję jakiegoś ogólnego obiektu, aby móc wybrać, a następnie wysłać pracę do odpowiedniego celu (np. Uniwersalny 'UITableViewDataSource', aby móc wybrać odpowiednią komórkę dla danego obiekt, a następnie ustawić ten obiekt); Sądzę, że jest to łatwiejsze w utrzymaniu i wymaga mniej redeclaracji, aby dyspozytor mógł znaleźć odpowiednie cele za pośrednictwem środowiska wykonawczego, a następnie zapytać ich, czego się spodziewają. Jakieś myśli na ten temat? – Tommy