Objektiv-C Typ Inferenz

8

Okay, ich habe das Gefühl, dass Sie schnell darauf hinweisen können, warum ich so verwirrt bin, aber ich habe eine Frage, warum das Folgende NICHT zu einem Compiler-Fehler oder einer Compiler-Warnung führt:

%Vor%

selectedObject ist ein NSObject , und name ist der Name eines @property vom Typ int .

Was mich irritiert ist, warum der Compiler vollkommen bereit ist anzunehmen, dass das Rückgabeergebnis von [ self.selectedObject valueForKey:name ] vom Typ NSNumber * ist (ohne es zu typisieren), um die Nachricht mit einem Aufruf von integerValue zu verketten.

Offensichtlich kuvertiert KVC Nicht-Objekt- "Zahl" -Typen in NSNumber , aber es gibt keine Möglichkeit für den Compiler zu wissen, dass -valueForKey: in diesem speziellen Fall eine NSNumber * zurückgibt.

Warum führt dies nicht dazu, dass eine Compiler-Warnung in den Zeilen " id " nicht auf ' -integerValue ' antwortet?

    
LucasTizma 16.01.2010, 08:06
quelle

1 Antwort

10

Ich hoffe, ich habe es richtig gemacht: Das liegt daran, dass id "besonders" ist. Objekte vom Typ id können an jede gewünschte Nachricht gesendet werden, es wird keine Überprüfung durch den Compiler durchgeführt und alles wird zur Laufzeit überprüft. Oder, mit anderen Worten, der id Typ ist der "dynamische Typisierungsteil" von Objective-C, während alle anderen Typen (wie NSObject ) der "statische Typisierungsteil" sind.

Auf diese Weise können Sie auswählen, wo Sie die statische Typisierung verwenden möchten und wo Sie die dynamische Typisierung verwenden möchten. Es ist vollkommen legal, so etwas zu tun:

%Vor%

Aber normalerweise schreiben Sie die Strings "fest" als NSString s, weil Sie die Bequemlichkeit der statischen Überprüfung der Kompilierungszeit bekommen und nur auf dynamische Typisierung zurückgreifen, wo die statische in den Weg kommen würde, wie in der valueForKey situation.

    
zoul 16.01.2010, 08:26
quelle

Tags und Links