Блочный синтаксис в Objective C (и, как я полагаю, C), как известно, неуместен. Передача блоков в качестве аргументов выглядит иначе, чем объявление блоков как ivars, что выглядит иначе, чем в typedef
блоках.
Есть ли полный список синтаксиса объявления блока, который я мог бы держать под рукой для быстрого ознакомления?
objective-c
syntax
objective-c-blocks
Патрик Перини
источник
источник
Ответы:
Список синтаксисов объявления блоков
Во всем, пусть
return_type
быть типом объекта / примитива / и т.д. Вы хотели бы вернуться (обычноvoid
)blockName
быть именем переменной блока, который вы создаетеvar_type
быть типом объекта / примитива / и т.д. вы хотели бы передать в качестве аргумента (оставьте пустым, без параметров)varName
быть именем переменной данного параметраИ помните, что вы можете создать столько параметров, сколько захотите.
Блоки как переменные
Возможно, самый распространенный способ декларации.
Блоки как свойства
Очень похоже на объявление блоков в качестве переменных, но немного отличающихся.
Блоки как параметры
Обратите внимание, что это отличается от «Блоки как аргументы»; в этом случае вы объявляете метод, который хочет аргумент блока.
Блоки как аргументы
Обратите внимание, что это отличается от «Блоки как параметры»; в этом случае вы вызываете метод, который хочет аргумент блока с анонимным блоком. Если вы уже объявили блочную переменную, достаточно передать имя переменной в качестве аргумента.
Анонимный блок
Функционально это анонимный блок, однако синтаксис для назначения блоков переменным состоит в том, чтобы просто установить переменную равной анонимному блоку.
typedef
блокЭто позволяет вам установить короткое имя, на которое можно ссылаться, как и на любое другое имя класса во время объявления блоков.
Чтобы потом использовать
blockName
вместо стандартного синтаксиса объявления блока, просто подставьте.Встроенный блок
Возможно, это менее полезное использование блоков, но, тем не менее, может иметь место. Встроенный блок - это анонимный блок, вызываемый сразу после создания экземпляра.
Встроенные блоки в первую очередь полезны для смещения контекста и примерно эквивалентны простым фрагментам кода, разделенным скобками.
Рекурсивные блоки
Это позволяет вам вызывать блок из себя, создавая цикл, который можно использовать во время обратных вызовов и вызовов GCD. Этот метод создания экземпляров не содержит циклов сохранения в ARC.
Возвращающиеся блоки
Метод может вернуть блок,
как может функция, если немного странно.
Дополнения
Если я что-то пропустил, пожалуйста, дайте мне знать в комментариях, и я исследую / добавлю их.
Ох, и в Свифте ...
Это почти как языковая особенность.
источник
BlockType ^blockVar = Anonymous Block
показывает синтаксическую ошибку, тоже без ^ :(Мне лично нравится использовать этот сайт ( http://fuckingblocksyntax.com ). Имя легче запомнить, чем сам синтаксис блока:
http://fuckingblocksyntax.com
и если вы не можете загрузить URL с плохими словами в них, вы можете использовать это зеркало: http://goshdarnblocksyntax.com
источник
Операторы typedef:
В линию:
Метод:
источник
Библиотека фрагментов Xcode 4 содержит шаблоны для определения типов блоков и встроенных блоков в качестве переменных. Они также доступны через автозаполнение (
typedefblock
иinlineblock
).Для блоков в качестве аргументов методов, я бы рекомендовал объявить a,
typedef
а затем просто использовать это. Это делает код намного проще для чтения.источник
Я написал блок завершения для класса, который будет возвращать значения кубиков после их встряхивания:
Определите typedef с помощью returnType (
.h
вышеуказанное@interface
объявление)Определить
@property
для блока (.h
)Определите метод с помощью
finishBlock
(.h
)Вставьте предыдущий определенный метод в
.m
файле и фиксацииfinishBlock
к@property
определены доДля запуска
completionBlock
передачи предопределенной переменной типа (не забудьте проверить,completionBlock
существует ли )источник
источник
Если вам нужно вернуться в Xcode 4.2, вы также можете @synthesize блок, объявленный как свойство, так же, как если бы вы использовали свойство без блока. Не позволяйте синтаксису блока бросить вас.
Если ваше свойство блока это:
Тогда ваш @synthesize это:
Приветствия.
источник
@property blockName
не работает. Я думаю, что это должно быть@synthesize blockName;
? (для синтеза блока)