Список синтаксисов объявления блока
Всюду пусть
return_type
тип объекта / примитива / и т. Д. вы хотели бы вернуть (обычно void
)
blockName
будет именем переменной блока, который вы создаете
var_type
будет объектом типа / примитив / и т. Д. вы хотели бы передать в качестве аргумента (оставьте пустым, без параметров)
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. Этот метод создания экземпляров не содержит циклов сохранения в ARC.
__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)
{
// ...
}
1077 * Дополнения *
Если я что-то пропустил, пожалуйста, дайте мне знать в комментариях, и я исследую / добавлю их.
Ох, а в Свифте ...
blockName = (varName: var_type) -> (return_type)
Это почти как языковая функция.