Objective-C Blockparameter

8

Sagen wir, wir haben diesen Block:

%Vor%

Mein aktuelles Verständnis davon ist: Der erste int ist der Rückgabetyp, (^aBlock)(BOOL) gibt den Namen der Methode und den Typ ihres Parameters an und = ^(BOOL param) ist der Name des Parameters innerhalb des Blocks ... plus den Typ des Parameters wieder?

Warum ist die Syntax so, dass wir den Parametertyp zweimal auflisten müssen? Könnten die beiden Typen jemals anders sein?

    
chm 15.10.2012, 03:47
quelle

4 Antworten

11

Es ist nicht ganz "den Parametertyp zweimal auflisten", Sie deklarieren im ersten Fall den Typ einer Blockvariablen , und im zweiten Fall definieren Sie ein Blockliteral Dann weisen Sie das Literal dem Wert der Variablen zu. Man könnte sogar etwas Ähnliches machen, was gleichbedeutend ist und die Tatsache verdeutlicht, dass es sich tatsächlich um zwei völlig unabhängige Deklarationen handelt, obwohl sie mit einer Zuweisung verknüpft sind:

%Vor%

Die Tatsache, dass sie unabhängig voneinander sind, bedeutet, dass es wahrscheinlich nicht einmal richtig ist, eine Art Übertragung oder Vererbung von Tippinformationen von der linken Seite des Ausdrucks auf der rechten Seite zu versuchen. Und ja, die Typen können unterschiedlich sein - bedenken Sie, dass dieser Code kompiliert und gut ausgeführt wird:

%Vor%

Hoffe, das hilft!

    
Carl Veazey 15.10.2012, 04:13
quelle
2

Das Code-Snippet, das Sie angegeben haben, ist keine Blockdeklaration: es ist eine Blockdeklaration und eine Blockdefinition. Zuerst deklarieren Sie einen Bezeichner namens aBlock :

%Vor%

Dann definierst du einen Block:

%Vor%

Beide werden getrennt analysiert und ausgewertet. Da Sie dem anderen einen zuweisen, führt der Compiler eine Typüberprüfung durch, um sicherzustellen, dass der Ausdruck auf der linken Seite (Ihre aBlock -Deklaration) vom selben Typ ist wie der Ausdruck auf der rechten Seite (der Block) Definition).

Die Antwort lautet also, dass diese Teile separat ausgewertet werden müssen. Da die Blockdefinition selbst kompiliert wird, müssen Sie den Typ von param angeben, da der Compiler andernfalls nicht weiß, um welchen Typ es sich handelt. (Ja, Sie könnten in diesem Fall eine Ausnahme machen und über die Zuweisung schauen, aber überall sonst in der C-Sprache deklarieren Sie einen Bezeichner, indem Sie zuerst einen Typ angeben. Warum also anders?)

Aber - Sie können sagen - wenn das stimmt, warum musste ich nicht den Rückgabetyp ( int ) auf der rechten Seite definieren?

Sehr scharfsinnig von dir. Die Antwort besteht darin, dass Sie beim Schreiben eines Blockausdrucks den Rückgabetyp nicht definieren müssen, da der Compiler dies aus der return-Anweisung (oder einem Mangel davon) innerhalb des Blocks ableiten kann.

(Warum also müssen Sie Rückgabetypen mit Funktionsdefinitionen angeben? Nun, Geschichte, schätze ich. Programmiersprachendefinitionen wurden von unvollkommenen Menschen erstellt.)

    
benzado 15.10.2012 04:11
quelle
1
  

Warum ist die Syntax so, dass wir den Parametertyp zweimal auflisten müssen?

Der Block ist auf diese Weise entworfen, und Sie können es so machen:

%Vor%

Es mag einfach

%Vor%
  

Könnten die beiden Typen jemals anders sein?

Nein, und außerdem sollte die Reihenfolge der Typen gleich sein, d. h .:

%Vor%

Und hier ist eine klare Figur für den Block:

    
Kjuly 15.10.2012 04:10
quelle
-1

Laut Rys Ziel-C-Lernprogramm :

  

Blöcke verwenden die gleiche Mechanik wie normale Funktionen. Sie können eine Blockvariable genau wie eine Funktion deklarieren.

%Vor%     
Rajkumar Yadav 08.07.2014 07:26
quelle