Список Синтаксиса Объявления Блока
синтаксис блока в Objective C (и действительно C, я полагаю) заведомо несочетаем. Передача блоков в качестве аргументов выглядит иначе, чем объявление блоков как ivars, что выглядит иначе, чем typedef
ing блоков.
есть ли полный список синтаксиса объявления блоков, который я мог бы держать под рукой для быстрого ознакомления?
7 ответов:
список синтаксисов объявления блоков
во всем, пусть
return_type
тип объекта/примитивные/и т. д. вы хотели бы вернуться (обычноvoid
)blockName
имя переменной блока, который вы создаетеvar_type
быть типом object / primitive / etc. вы хотите передать в качестве аргумента (оставьте пустым для параметров)varName
быть именем переменной данного параметри помните, что вы можете создать столько параметров, сколько вы хотите.
блоки как переменные
возможно, наиболее распространенный для декларации.
return_type (^blockName)(var_type) = ^return_type (var_type varName) { // ... };
блоки как свойства
очень похоже на объявление блоков в качестве переменных, однако тонко отличается.
@property (copy) return_type (^blockName) (var_type);
блоки как параметры
обратите внимание, что это отличается от" блоков в качестве аргументов"; в этом случае вы объявление метода, которому требуется аргумент блока.
- (void)yourMethod:(return_type (^)(var_type))blockName;
блоки в качестве аргументов
обратите внимание, что это отличается от "блоков Как параметров"; в этом случае вы вызываете метод, который хочет аргумент блока с анонимным блоком. Если вы уже объявили блочную переменную, достаточно передать имя переменной в качестве аргумента.
[someObject doSomethingWithBlock: ^return_type (var_type varName) { //... }];
Анонимный Блок
это функционально анонимный блок, однако синтаксис для присвоения блоков переменным достаточно просто установить переменную равной анонимному блоку.
^return_type (var_type varName) { //... };
typedef
блокэто позволяет настроить короткое имя, на которое можно ссылаться так же, как и на любое другое имя класса во время объявления блоков.
typedef return_type (^blockName)(var_type);
чтобы потом использовать
blockName
вместо стандартного синтаксиса объявления блока, просто замените.Встроенный Блок
это, возможно, менее полезное использование блоков, но может иметь свое место, тем не менее. Встроенный блок-это анонимный блок, вызываемый сразу после создания экземпляра.
^return_type (var_type varName) { //... }(var);
встроенные блоки в основном полезны для смещения области и примерно эквивалентны простым фрагментам кода с разделителями скобок.
{ //... }
Рекурсивные Блоки
это позволяет вызывать блок из себя, создавая цикл, который может быть использован во время обратных вызовов и вызовов GCD. Этот метод создания экземпляра освободите сохранять циклы в дуге.
__block return_type (^blockName)(var_type) = [^return_type (var_type varName) { if (returnCondition) { blockName = nil; return; } // ... } copy]; blockName(varValue);
Возвращение Блоков
метод может возвращать блоке
- (return_type(^)(var_type))methodName { // ... }
как может функция, если немного странно.
return_type (^FunctionName())(var_type) { // ... }
Addendums
если я что-то пропустил, пожалуйста, дайте мне знать в комментариях, я проверю/добавлю их.
О, и в Swift...
blockName = (varName: var_type) -> (return_type)
это почти как языковая функция.
Мне лично нравится использовать этот сайт (http://fuckingblocksyntax.com). имя легче запомнить, чем сам синтаксис блока:
http://fuckingblocksyntax.com
и если вы не можете загрузить URL-адреса с плохими словами в них вы можете использовать это зеркало:http://goshdarnblocksyntax.com
Typedef:
typedef void (^block)(NSString *arg);
Inline:
void (^block)(NSString *) = ^(NSString *param) { // do something.... };
способ:
- (void)method:(void (^)(NSString *param))handler
библиотека фрагментов Xcode 4 содержит шаблоны для типов блоков и встроенных блоков в качестве переменных. Они также доступны через автозаполнение (
typedefblock
иinlineblock
).для блоков в качестве аргументов методов, я бы порекомендовал объявлении
typedef
а потом просто использовать это. Это делает код намного проще для чтения.
я написал completionBlock для класса, который будет возвращать значения кости после того, как они были потрясены:
определить typedef с returnType (
.h
выше@interface
декларация)typedef void (^CompleteDiceRolling)(NSInteger diceValue);
определение
@property
блока (.h
)@property (copy, nonatomic) CompleteDiceRolling completeDiceRolling;
определите метод с помощью
finishBlock
(.h
)- (void)getDiceValueAfterSpin:(void (^)(NSInteger diceValue))finishBlock;
вставить предыдущий определенный метод в
.m
файл и фиксацияfinishBlock
до@property
определен до- (void)getDiceValueAfterSpin:(void (^)(NSInteger diceValue))finishBlock{ self.completeDiceRolling = finishBlock; }
триггер
completionBlock
передайте ему предопределенный переменный тип (Не забудьте проверить, является лиcompletionBlock
существует)if( self.completeDiceRolling ){ self.completeDiceRolling(self.dieValue); }
typedef void (^OkBtnBlock)(id data); typedef void (^CancelBtnBlock)(); @property (nonatomic, strong) OkBtnBlock okBtnBlock; @property (nonatomic, strong) CancelBtnBlock cancelBtnBlock; + (void)foo:(OkBtnBlock)okBtn andCancel:(CancelBtnBlock)btnCancel;
Если вам нужно вернуться в Xcode 4.2, вы также можете @синтезировать блок, объявленный как свойство, так же, как и с неблочным свойством. Не позволяйте синтаксису блока бросить вас.
Если ваше свойство блока таково:
@property (copy) return_type (^blockName) (var_type);
тогда ваш @синтезировать это:
@property blockName;
Ура.