Список Синтаксиса Объявления Блока


синтаксис блока в Objective C (и действительно C, я полагаю) заведомо несочетаем. Передача блоков в качестве аргументов выглядит иначе, чем объявление блоков как ivars, что выглядит иначе, чем typedefing блоков.

есть ли полный список синтаксиса объявления блоков, который я мог бы держать под рукой для быстрого ознакомления?

7 274

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

fuckingblocksyntax website

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 для класса, который будет возвращать значения кости после того, как они были потрясены:

  1. определить typedef с returnType (.h выше @interface декларация)

    typedef void (^CompleteDiceRolling)(NSInteger diceValue);
    
  2. определение @property блока (.h)

    @property (copy, nonatomic) CompleteDiceRolling completeDiceRolling;
    
  3. определите метод с помощью finishBlock (.h)

    - (void)getDiceValueAfterSpin:(void (^)(NSInteger diceValue))finishBlock;
    
  4. вставить предыдущий определенный метод в .m файл и фиксация finishBlock до @property определен до

    - (void)getDiceValueAfterSpin:(void (^)(NSInteger diceValue))finishBlock{
        self.completeDiceRolling = finishBlock;
    }
    
  5. триггер 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;

Ура.