Lista składni deklaracji blokowych
Niech przez cały czas
return_type
być typem obiektu / prymitywu / etc. chcesz wrócić (zwykle void
)
blockName
być nazwą zmiennej tworzonego bloku
var_type
być obiektem typu / prymitywne / itp. chcesz przekazać jako argument (pozostaw puste dla żadnych parametrów)
varName
być nazwą zmiennej podanego parametru
I pamiętaj, że możesz utworzyć dowolną liczbę parametrów.
Bloki jako zmienne
Prawdopodobnie najczęstszy z deklaracji.
return_type (^blockName)(var_type) = ^return_type (var_type varName)
{
// ...
};
Bloki jako właściwości
Podobnie jak deklarowanie bloków jako zmiennych, jednak subtelnie różne.
@property (copy) return_type (^blockName) (var_type);
Bloki jako parametry
Zauważ, że różni się to od „Bloków jako argumentów”; w tym przypadku deklarujesz metodę, która chce argumentu blokowego.
- (void)yourMethod:(return_type (^)(var_type))blockName;
Bloki jako argumenty
Zauważ, że różni się to od „Bloków jako parametrów”; w tym przypadku wywołujesz metodę, która chce argumentu blokowego z anonimowym blokiem. Jeśli zadeklarowałeś już zmienną blokową, wystarczy podać nazwę zmiennej jako argument.
[someObject doSomethingWithBlock: ^return_type (var_type varName)
{
//...
}];
Blok anonimowy
Jest to funkcjonalnie blok anonimowy, jednak składnia przypisywania bloków do zmiennych polega po prostu na ustawieniu zmiennej równej blokowi anonimowemu.
^return_type (var_type varName)
{
//...
};
typedef
Blok
Pozwala to ustawić krótką nazwę, do której można się odwoływać, tak jak każdą inną nazwę klasy podczas deklarowania bloków.
typedef return_type (^blockName)(var_type);
Aby później użyć blockName
zamiast standardowej składni deklaracji bloku, po prostu zamień.
Blok wbudowany
Jest to prawdopodobnie mniej użyteczne wykorzystanie bloków, ale może jednak mieć swoje miejsce. Blok wbudowany to blok anonimowy wywoływany natychmiast po utworzeniu wystąpienia.
^return_type (var_type varName)
{
//...
}(var);
Bloki wbudowane są przede wszystkim przydatne do przesunięcia zakresu i są w przybliżeniu równoważne prostym fragmentom kodu rozdzielanym nawiasami klamrowymi.
{
//...
}
Bloki rekurencyjne
Umożliwia to samodzielne wywołanie bloku, tworząc pętlę, z której można korzystać podczas wywołań zwrotnych i połączeń GCD. Ta metoda tworzenia instancji jest wolna od cykli zatrzymania w ARC.
__block return_type (^blockName)(var_type) = [^return_type (var_type varName)
{
if (returnCondition)
{
blockName = nil;
return;
}
// ...
} copy];
blockName(varValue);
Powracające bloki
Metoda może zwrócić blok,
- (return_type(^)(var_type))methodName
{
// ...
}
jak również funkcja, choć trochę dziwnie.
return_type (^FunctionName())(var_type)
{
// ...
}
Dodatki
Jeśli coś przeoczyłem, daj mi znać w komentarzach, a ja je zbadam / dodam.
Aha, i w Swift ...
blockName = (varName: var_type) -> (return_type)
To prawie jak funkcja językowa.