• Das kreative Thema des Monats Oktober wird vor allem diejenigen unter Euch besonders ansprechen, denen Do-it-yourself quasi im Blut liegt. Zeigt uns Eure Improvisationskünste oder fotografiert, was andere Leute sich so im Alltag zusammengestrickt haben. --> Zum Mitmachen bitte hier klicken

Auf Array prüfen

Drobs

Carola
Registriert
23.05.08
Beiträge
115
Hallo ihr Pro's,

ich stehe grade total auf der Leitung und habe auch nach aktivem Googeln und Bücher durchstöbern keine Antwort gefunden.

Wie kann ich Überprüfen ob ein Objekt vom Typ NSArray ist?

Das kann ja eig. nicht so schwer sein, aber ich komme grade echt nicht drauf.

Danke schon mal fürs "Augenöffnen" :-D
 
Code:
if([deinObject isKindOfClass:[NSArray class]])
{
     NSLog(@"%@ ist ein Objekt der Klasse ", deinObject);
}
else
{
     NSLog(@"%@ ist kein Objekt der Klasse ", deinObject);
}
 
Wichtigste Frage: Warum willst Du das? Du solltest nie ohne guten Grund fragen, was das für eine Klasse ist.

Stattdessen solltest Du fragen, ob das Objekt die Nachrichten versteht, die Du senden willst mit doesRespondToSelector:

Alex
 
Ich will wissen ob es ein Array ist, damit ich nicht probiere einen String zu durchlaufen, da mein Objekt ein Array oder aber ein String sein kann.

Deswegen wäre die erste Variante für mich wohl besser, da ich nicht erst gucken muss, ob das Objekt auf eine NSArray spezifische Funktion antwortet, die ich garnicht nutzen will.

Warum soll ich eigentlich nicht ohne Grund fragen was das für ne Klasse ist? Wo liegt da das Problem?

Danke für die Hilfe.
 
a) Alex hat nicht gesagt, dass du nach Methoden suchen sollst, die du nicht benötigst. Du sollst nur nach Methoden suchen, die du benötigst. Wenn du ein Objekt durchlaufen willst, dann muss es – falls du das nutzen möchtest – auf das Enumerator-Protokoll hören. Das kannst du abfragen. Wenn du es indizieren möchtest, dann muss es auf die Methode -objectAtIndex: hören. Das kannst du abfragen.

b) Es gibt kein Problem, nach der Klasse zu fragen. Es hat bloß Nachteile:

- Eine solche Frage ist C++ oder Java, aber nicht Objective-C. Bei jeder deiner Nachrichten wird abgefragt, ob der Empfänger auf eine bestimmte Methode hört. Dabei spielt es keine Rolle, zu welcher Klasse der Empfänger gehört. So denkt Objective-C und das nennt man Late-Binding.

- Wieso solltest du eine Frage stellen, die dich nicht interessiert. Es kann dir doch am Arsch vorbeigehen, ob das ein Array ist oder nicht. Du willst abzählen? Dann frage nach, ob das Ding abgezählt werden kann. Stell dir vor, es ist ein Set. Das kann abgezählt werden. Dein Code würde also funktionieren. Du würdest es aber verweigern, weil es kein Array ist. Wieso?

Beispiel aus meinem Buch: Du willst eine Tippse einstellen. Du kannst jetzt jede Bewerberin fragen, ob sie Sekretärin ist, weil du vermutest, dass eine Sekretärin tippen kann. Aber wozu? Frag die Bewerberin doch einfach, ob sie tippen kann.
 
  • Like
Reaktionen: below
In dieser Hinsicht würde dir auch das weiterhelfen, es sei denn, du benutzt kein Obj-C 2.0:

– conformsToProtocol:

da schaust du nach, ob das Objekt NSFastEnumeration unterstützt. feddich...

Gruss ppocket
 
Und wenn er kein Objective-C 2.0 nutzt, fragt er halt ab, ob es das Objekt etwas mit objectEnumerator anfangen kann.
Code:
SEL enumeratorSelector = @selector( objectEnumerator );
if( [object respondsToSelector:enumeratorSelector )] ) {
   NSEnumerator* itemsEnum = [object objectEnumerator];
   while( (id = [itemsEnum]) ) {
      // benutze mich
      // wirf mich weg
   }
}
 
  • Like
Reaktionen: Poljpocket