Список синтаксисів декларації блоків
По всьому, нехай
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. Цей метод інстанції не містить циклів утримування в АРК.
__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)
{
// ...
}
Додатки
Якщо я щось пропустив, будь ласка, повідомте мене про це в коментарях, і я досліджу / додам їх.
О, і в Свіфті ...
blockName = (varName: var_type) -> (return_type)
Це майже як мовна особливість.