Die Blocksyntax in Ziel C (und tatsächlich in C, nehme ich an) ist notorisch inkongruent. Das Übergeben von Blöcken als Argumente sieht anders aus als das Deklarieren von Blöcken als ivars, was anders aussieht als das Blockieren von typedef
Blöcken.
Gibt es eine umfassende Liste der Blockdeklarationssyntax, die ich zur schnellen Referenz bereithalten könnte?
objective-c
syntax
objective-c-blocks
Patrick Perini
quelle
quelle
Antworten:
Liste der Blockdeklarationssyntaxen
Lassen Sie während
return_type
sei der Typ des Objekts / Primitivs / etc. Sie möchten (häufigvoid
) zurückkehrenblockName
Seien Sie der Variablenname des Blocks, den Sie erstellenvar_type
sei der Typ Objekt / Primitiv / etc. Sie möchten als Argument übergeben (leer lassen für keine Parameter)varName
sei der Variablenname des angegebenen ParametersUnd denken Sie daran, dass Sie so viele Parameter erstellen können, wie Sie möchten.
Blöcke als Variablen
Möglicherweise die häufigste Erklärung.
Blöcke als Eigenschaften
Ähnlich wie das Deklarieren von Blöcken als Variablen, jedoch geringfügig anders.
Blöcke als Parameter
Beachten Sie, dass sich dies von "Blöcke als Argumente" unterscheidet. In diesem Fall deklarieren Sie eine Methode, die ein Blockargument wünscht.
Blöcke als Argumente
Beachten Sie, dass sich dies von "Blöcke als Parameter" unterscheidet. In diesem Fall rufen Sie eine Methode auf, die ein Blockargument mit einem anonymen Block möchte. Wenn Sie bereits eine Blockvariable deklariert haben, reicht es aus, den Variablennamen als Argument zu übergeben.
Anonymer Block
Dies ist funktional ein anonymer Block. Die Syntax zum Zuweisen von Blöcken zu Variablen besteht jedoch einfach darin, die Variable einem anonymen Block gleichzusetzen.
typedef
BlockAuf diese Weise können Sie einen Kurznamen einrichten, auf den wie bei jedem anderen Klassennamen während der Blockdeklaration verwiesen werden kann.
Um sie später
blockName
anstelle der Standard-Blockdeklarationssyntax zu verwenden, ersetzen Sie sie einfach.Inline-Block
Dies ist wohl eine weniger nützliche Verwendung von Blöcken, kann aber dennoch ihren Platz haben. Ein Inline-Block ist ein anonymer Block, der unmittelbar nach der Instanziierung aufgerufen wird.
Inline-Blöcke sind in erster Linie zum Versetzen des Bereichs nützlich und entsprechen in etwa einfachen, durch Klammern getrennten Codeabschnitten.
Rekursive Blöcke
Auf diese Weise können Sie einen Block von sich aus aufrufen und eine Schleife erstellen, die bei Rückrufen und GCD-Aufrufen verwendet werden kann. Diese Instanziierungsmethode ist frei von Aufbewahrungszyklen in ARC.
Blöcke zurückgeben
Eine Methode kann einen Block zurückgeben.
wie kann eine Funktion, wenn auch etwas seltsam.
Nachträge
Wenn ich etwas verpasst habe, lass es mich bitte in den Kommentaren wissen und ich werde sie recherchieren / hinzufügen.
Oh, und in Swift ...
Es ist fast so, als wäre es eine Sprachfunktion.
quelle
BlockType ^blockVar = Anonymous Block
zeigt Syntaxfehler, auch ohne ^ :(Ich persönlich benutze diese Website gerne ( http://fuckingblocksyntax.com ). Der Name ist leichter zu merken als die Blocksyntax selbst:
http://fuckingblocksyntax.com
und wenn Sie keine URLs mit schlechten Wörtern laden können, können Sie diesen Spiegel verwenden: http://goshdarnblocksyntax.com
quelle
Typedef:
In der Reihe:
Methode:
quelle
Die Xcode 4-Snippet-Bibliothek enthält Vorlagen für Blocktypedefs und Inline-Blöcke als Variablen. Sie sind auch über die automatische Vervollständigung (
typedefblock
undinlineblock
) verfügbar .Für Blöcke als Argumente für Methoden würde ich empfehlen, a zu deklarieren
typedef
und dann einfach zu verwenden. Dies erleichtert das Lesen des Codes erheblich.quelle
Ich habe einen CompletionBlock für eine Klasse geschrieben, der die Werte eines Würfels zurückgibt, nachdem er geschüttelt wurde:
Definieren Sie typedef mit returnType (
.h
obige@interface
Deklaration)Definiere a
@property
für den Block (.h
)Definieren Sie eine Methode mit
finishBlock
(.h
)Insert vorherige definierte Methode in
.m
Datei und verpflichtenfinishBlock
zu@property
definiert vorUm
completionBlock
einen vordefinierten Variablentyp an ihn auszulösen (Vergessen Sie nicht zu prüfen, ob dercompletionBlock
vorhanden ist).quelle
quelle
Wenn Sie in Xcode 4.2 zurückarbeiten müssen, können Sie auch einen als Eigenschaft deklarierten Block @synthesize, genau wie Sie es mit einer Nicht-Block-Eigenschaft tun würden. Lassen Sie sich nicht von der Blocksyntax überraschen.
Wenn Ihre Blockeigenschaft folgende ist:
Dann lautet Ihre @synthesize wie folgt:
Prost.
quelle
@property blockName
funktioniert nicht. Ich denke es sollte sein@synthesize blockName;
? (zum Synthetisieren eines Blocks)