Syntax, um einen Block zu definieren, der einen Block akzeptiert und einen Block in Objective-C zurückgibt

8

Ich finde in Apples Dokument Arbeiten mit Blöcken , dass die Syntax einen Block definiert, der das Ergebnis der Multiplikation zweier Werte zurückgibt:

%Vor%

unterscheidet sich von der Definition eines Blocks, der einen anderen Block als Argument akzeptiert und einen weiteren Block zurückgibt:

%Vor%

Warum ist die zweite Syntax nicht void (^)(void)(^complexBlock)(void (^)(void)) ?

    
lu yuan 27.11.2014, 03:22
quelle

2 Antworten

14

So funktioniert die C-Syntax. Die Block-Syntax basiert auf den Funktionszeigern , was auf Dennis Ritchies Idee, dass " die Deklaration eines Dinges sollte wie der Gebrauch dieses Dinges aussehen. "

Wenn Sie den von Ihnen definierten "komplexen Block" verwenden und dann den zurückgegebenen Block in derselben Zeile aufrufen würden, würde dies wie folgt aussehen:

%Vor%

Außerdem folgt das Parsen von C-Deklarationen einer sogenannten "Rechts-Links-Regel" . Der erste Schritt ist "Finde die Kennung". Für Ihre Deklaration ist das complexBlock .

%Vor%

Dann schau nach rechts. Wir haben eine schließende Klammer, also das Ende einer Deklaration "Einheit".

%Vor%

Gehe zurück zum Anfang des aktuellen Teils und lies nach links bis zu einer öffnenden Klammer. Wir finden den Caret, der einen Blocktyp angibt. Lesen Sie weiter links und suchen Sie eine öffnende Klammer, die diesen Teil der Deklaration schließt.

%Vor%

Als nächstes gehe wieder nach rechts. Hier finden wir eine öffnende Klammer, die den Beginn einer Parameterliste anzeigt. Überspringen Sie die Parameterliste, da Sie sich mit dem Rückgabetyp befassen, aber er wird analysiert, wie eine eigenständige Deklaration wäre.

%Vor%

Nun, da wir die Parameterliste verbraucht haben:

%Vor%

fahre fort, sich nach rechts zu bewegen, und wir treffen eine schließende Klammer:

%Vor%

Also, wieder zurück bis zum Anfang des aktuellen Teils und nach links gehen, wo wir den Block caret finden.

%Vor%

Hier ist der Schlüssel zu Ihrer Frage zu dieser Deklaration:

Wenn wir uns nach links bewegen, finden wir wieder eine öffnende Klammer, also kehren wir nach rechts zurück . Aus diesem Grund wird die Parameterliste des Rückgabe-Blocks am Ende der Deklaration eingefügt.

%Vor%

Nachdem alles durchgegangen ist, sollte der Rest selbstverständlich sein.

Übrigens hat die Seite, mit der ich über die Rechts-Links-Regel verbunden bin, ein paar Demonstrationen wie meine, von denen eine Funktionszeiger enthält. Sie können auch von Ссылка amüsiert werden. Dies ist eine Online-Implementierung eines Programms, das C-Deklarationen analysiert und Ihnen hilft, die wilderen Varianten zu verstehen.

>     
Josh Caswell 27.11.2014, 05:03
quelle
1

Obj-C-Block-Syntax ist ziemlich schwer zu lesen, dies kann mit typedefs etwas vereinfacht werden.

%Vor%     
Nick 27.11.2014 04:01
quelle