Elenco delle sintassi della dichiarazione di blocco
In tutto, lascia
return_type
essere il tipo di oggetto / primitivo / ecc. vorresti tornare (comunemente void
)
blockName
essere il nome della variabile del blocco che stai creando
var_type
essere il tipo oggetto / primitivo / ecc. si desidera passare come argomento (lasciare vuoto per nessun parametro)
varName
essere il nome della variabile del parametro dato
E ricorda che puoi creare tutti i parametri che desideri.
Blocchi come variabili
Forse il più comune per dichiarazione.
return_type (^blockName)(var_type) = ^return_type (var_type varName)
{
};
Blocchi come proprietà
Un po 'come dichiarare i blocchi come variabili, anche se leggermente differenti.
@property (copy) return_type (^blockName) (var_type);
Blocchi come parametri
Notare che questo è diverso da "Blocchi come argomenti"; in questo caso, stai dichiarando un metodo che vuole un argomento di blocco.
- (void)yourMethod:(return_type (^)(var_type))blockName;
Blocchi come argomenti
Notare che questo è diverso da "Blocchi come parametri"; in questo caso, stai chiamando un metodo che vuole un argomento di blocco con un blocco anonimo. Se hai già dichiarato una variabile di blocco, è sufficiente passare il nome della variabile come argomento.
[someObject doSomethingWithBlock: ^return_type (var_type varName)
{
}];
Blocco anonimo
Questo è funzionalmente un blocco anonimo, tuttavia la sintassi per assegnare blocchi alle variabili è semplicemente quella di impostare la variabile uguale a un blocco anonimo.
^return_type (var_type varName)
{
};
typedef
Bloccare
Ciò consente di impostare un nome breve a cui è possibile fare riferimento proprio come qualsiasi altro nome di classe durante la dichiarazione dei blocchi.
typedef return_type (^blockName)(var_type);
Per un utilizzo successivo blockName
posto della sintassi di dichiarazione di blocco standard, è sufficiente sostituire.
Blocco in linea
Questo è probabilmente un utilizzo meno utile dei blocchi, ma può comunque avere il suo posto. Un blocco inline è un blocco anonimo chiamato immediatamente dopo l'istanza.
^return_type (var_type varName)
{
}(var);
I blocchi inline sono utili principalmente per l'offset dell'ambito e sono più o meno equivalenti a semplici blocchi di codice delimitati da parentesi graffe.
{
}
Blocchi ricorsivi
Ciò consente di chiamare un blocco da se stesso, creando un loop che può essere utilizzato durante i callback e le chiamate GCD. Questo metodo di creazione di istanze è privo di cicli di ritenzione in ARC.
__block return_type (^blockName)(var_type) = [^return_type (var_type varName)
{
if (returnCondition)
{
blockName = nil;
return;
}
} copy];
blockName(varValue);
Restituzione di blocchi
Un metodo può restituire un blocco,
- (return_type(^)(var_type))methodName
{
}
come può una funzione, anche se un po 'strana.
return_type (^FunctionName())(var_type)
{
}
Addendum
Se mi sono perso qualcosa, fatemelo sapere nei commenti e li ricercherò / aggiungerò.
Oh, e in Swift ...
blockName = (varName: var_type) -> (return_type)
È quasi come se fosse una caratteristica del linguaggio.