Liste der Blockdeklarationssyntaxen
Lassen Sie während
return_type
sei der Typ des Objekts / Primitivs / etc. Sie möchten (häufig void
) zurückkehren
blockName
Seien Sie der Variablenname des Blocks, den Sie erstellen
var_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 Parameters
Und 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.
return_type (^blockName)(var_type) = ^return_type (var_type varName)
{
// ...
};
Blöcke als Eigenschaften
Ähnlich wie das Deklarieren von Blöcken als Variablen, jedoch geringfügig anders.
@property (copy) return_type (^blockName) (var_type);
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.
- (void)yourMethod:(return_type (^)(var_type))blockName;
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.
[someObject doSomethingWithBlock: ^return_type (var_type varName)
{
//...
}];
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.
^return_type (var_type varName)
{
//...
};
typedef
Block
Auf diese Weise können Sie einen Kurznamen einrichten, auf den wie bei jedem anderen Klassennamen während der Blockdeklaration verwiesen werden kann.
typedef return_type (^blockName)(var_type);
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.
^return_type (var_type varName)
{
//...
}(var);
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.
__block return_type (^blockName)(var_type) = [^return_type (var_type varName)
{
if (returnCondition)
{
blockName = nil;
return;
}
// ...
} copy];
blockName(varValue);
Blöcke zurückgeben
Eine Methode kann einen Block zurückgeben.
- (return_type(^)(var_type))methodName
{
// ...
}
wie kann eine Funktion, wenn auch etwas seltsam.
return_type (^FunctionName())(var_type)
{
// ...
}
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 ...
blockName = (varName: var_type) -> (return_type)
Es ist fast so, als wäre es eine Sprachfunktion.