Składnia bloku w celu C (i rzeczywiście C, jak przypuszczam) jest notorycznie niestosowna. Przekazywanie bloków jako argumentów wygląda inaczej niż deklarowanie bloków jako ivars, które wyglądają inaczej niż typedef
blokowanie bloków.
Czy istnieje wyczerpująca lista składni deklaracji blokowej, którą mógłbym mieć pod ręką w celu szybkiego zapoznania się z nią?
objective-c
syntax
objective-c-blocks
Patrick Perini
źródło
źródło
Odpowiedzi:
Lista składni deklaracji blokowych
Niech przez cały czas
return_type
być typem obiektu / prymitywu / etc. chcesz wrócić (zwyklevoid
)blockName
być nazwą zmiennej tworzonego blokuvar_type
być obiektem typu / prymitywne / itp. chcesz przekazać jako argument (pozostaw puste dla żadnych parametrów)varName
być nazwą zmiennej podanego parametruI pamiętaj, że możesz utworzyć dowolną liczbę parametrów.
Bloki jako zmienne
Prawdopodobnie najczęstszy z deklaracji.
Bloki jako właściwości
Podobnie jak deklarowanie bloków jako zmiennych, jednak subtelnie różne.
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.
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.
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.
typedef
BlokPozwala to ustawić krótką nazwę, do której można się odwoływać, tak jak każdą inną nazwę klasy podczas deklarowania bloków.
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.
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.
Powracające bloki
Metoda może zwrócić blok,
jak również funkcja, choć trochę dziwnie.
Dodatki
Jeśli coś przeoczyłem, daj mi znać w komentarzach, a ja je zbadam / dodam.
Aha, i w Swift ...
To prawie jak funkcja językowa.
źródło
BlockType ^blockVar = Anonymous Block
Błąd logiczny pokazuje błąd składni, również bez ^ :(Osobiście lubię korzystać z tej strony ( http://fuckingblocksyntax.com ). Nazwa jest łatwiejsza do zapamiętania niż sama składnia bloku:
http://fuckingblocksyntax.com
a jeśli nie możesz załadować adresów URL ze złymi słowami, możesz użyć tego dublowania: http://goshdarnblocksyntax.com
źródło
Typedef:
Inline:
Metoda:
źródło
Biblioteka fragmentów kodu Xcode 4 zawiera szablony bloków typedefs i bloków wstawianych jako zmiennych. Są one również dostępne poprzez automatyczne uzupełnianie (
typedefblock
iinlineblock
).W przypadku bloków jako argumentów metod, zaleciłbym zadeklarowanie a,
typedef
a następnie użycie tego. Znacznie ułatwia to odczytanie kodu.źródło
Napisałem funkcję completeBlock dla klasy, która zwróci wartości kości po ich wstrząśnięciu:
Zdefiniuj typedef za pomocą returnType (
.h
powyżej@interface
deklaracji)Zdefiniuj a
@property
dla bloku (.h
)Zdefiniuj metodę za pomocą
finishBlock
(.h
)Wkładka poprzedniej metody zdefiniowanej w
.m
pliku i zobowiązać sięfinishBlock
do@property
zdefiniowanych wcześniejAby uruchomić
completionBlock
przekazanie predefiniowanej zmiennejType (nie zapomnij sprawdzić, czycompletionBlock
istnieje)źródło
źródło
Jeśli musisz wrócić do Xcode 4.2, możesz również @syntezować blok zadeklarowany jako właściwość, tak jak w przypadku właściwości nieblokowanej. Nie pozwól, by składnia bloku cię rzuciła.
Jeśli twoja właściwość bloku to:
Twój @synthesize to:
Twoje zdrowie.
źródło
@property blockName
nie działa. Myślę, że tak powinno być@synthesize blockName;
? (do syntezy bloku)