Kod Podany fragment kodu nie jest deklaracją blokową: jest to deklaracja blokowa i definicja bloku. Po pierwsze, należy zadeklarować identyfikator nazwany aBlock
:
int (^aBlock)(BOOL)
następnie zdefiniować blok:
^(BOOL param) { ...
Obie te są analizowane i oceniane oddzielnie. Ponieważ przypisujesz jeden do drugiego, kompilator wykonuje test typu, aby upewnić się, że wyrażenie po lewej stronie (twoja deklaracja aBlock
) jest tego samego typu, co wyrażenie po prawej stronie (definicja bloku) .
Tak więc, odpowiedź jest taka, że te części należy oceniać oddzielnie. Ponieważ definicja bloku jest kompilowana na własną rękę, musisz uwzględnić typ param
, ponieważ w przeciwnym razie kompilator nie będzie wiedział, jaki powinien być typ. (Tak, możesz zrobić wyjątek w tym przypadku i spojrzeć na to zadanie, ale wszędzie indziej w języku C zadeklarujesz identyfikator, najpierw podając typ, więc dlaczego robisz to inaczej?)
Ale - możesz powiedzieć - czy to prawda, dlaczego nie musiałem zdefiniować typu zwrotu (int
) po prawej stronie?
Bardzo bystry z twojej strony. Odpowiedź jest taka, że podczas pisania wyrażenia blokowego nie trzeba definiować typu zwracanego, ponieważ kompilator może wywnioskować go z instrukcji return (lub jej braku) wewnątrz bloku.
(Więc dlaczego muszą zawierać typy wrócić z definicji funkcji? Cóż, historia, tak myślę. Definicje języka programowania zostały stworzone przez niedoskonałych ludzi.)
Tak, to niesamowite, dzięki. Żeby wyjaśnić, czy twój drugi fragment kodu jest przykładem przeniesienia informacji na klawiaturze (i dlatego nie jest mile widziany)? – chm
Nie, po prostu ilustruję, że typy między lewą i prawą stroną mogą być różne, a kod będzie kompilowany i uruchamiany. Nie ma zbyt wiele sprawdzania typów blokami innymi niż typy zwracane, o ile mogę to stwierdzić. Nie ma przeniesienia informacji o pisaniu, ponieważ tak naprawdę to nie jest, ja sformułowałem to trochę dziwnie, próbowałem powiedzieć, że nawet jeśli kompilator spróbowałby zrobić coś takiego, to niekoniecznie byłoby to poprawne, niektóre właściwości polimorficzne bloków, które mogłyby zakłócać taką funkcję. –