Свойство блока Objective C с завершением кода XCode - PullRequest
30 голосов
/ 03 февраля 2012

Можно ли определить свойство блока Objective-C, но в Xcode 4 все еще есть завершение полного кода?

Если я использую typedef для определения блока:

typedef void (^CompletionBlock)(MyObject *myObj);

и затем определите свойство:

@property (nonatomic, copy) CompletionBlock completionBlock;

, а затем @synthesize свойство Я не получаю полное завершение кода при вызове метода установки.Xcode будет использовать typedef, и из-за этого при завершении кода не используется полный синтаксис блока с параметрами блока, он использует typedef.

Если я определяю прототип метода в заголовке, который использует полныйблочный синтаксис вместо typedef:

@property (nonatomic, copy) void (^completionBlock)(MyObject *myObj);

, а затем я использую @synthesize, предоставленный установщик приближается к использованию полного синтаксиса завершения кода, но принципиально он пропускает имена параметров:

[self setCompletionBlock:(void (^)(MyObject *)) { ... }

Наконец, если я попытаюсь @synthesize, а затем переопределить реализацию метода установки или поместить прототип в заголовок:

- (void)setCompletionBlock:(void (^)(MyObject *myObj))completionBlock {...}

Выдается предупреждение о том, что тип свойства не соответствует типу метода доступа.Независимо от того, как я пытаюсь определить синтаксис, я не могу определить свойство блока и метод установки, который имеет полный синтаксис для завершения кода.Могу ли я взять свой торт и съесть его тоже?

Спасибо!

Ответы [ 4 ]

35 голосов
/ 23 августа 2012

Вы определенно можете съесть свой торт и съесть его, если хотите добавить еще одну строку кода в интерфейс вашего класса.

Сначала определите блок с помощью typedef и создайте свойство, как вы задали в своем вопросе:

typedef void (^CompletionBlock)(MyObject *myObj);

...

@property (nonatomic, copy) CompletionBlock completionBlock;

Далее, как MobileOverload указал в своем ответе, мы знаем, что Xcode обеспечивает правильное завершение кода для блоков typedef'd, если используется в объявлении автономного метода. Итак, давайте добавим явное объявление для установщика completionBlock:

- (void)setCompletionBlock:(CompletionBlock)completionBlock;

При вызове этот метод преобразуется в метод сеттера, объявленный свойством. Однако, поскольку мы явно определили его в интерфейсе класса, XCode видит это и применяет полное завершение кода.

Итак, если вы включите все три из этих строк, вы должны получить желаемый результат. Такое поведение явно является недостатком Xcode, поскольку нет причины, по которой метод определения, определенный в операторе @property, должен иметь завершение кода, отличное от того же самого метода, определенного самостоятельно.

4 голосов
/ 03 февраля 2012

Вы можете получить необычное завершение кода при передаче своих блоков в качестве аргумента методу в вашем классе. В заголовочном файле я ввожу определение блока, подобного этому

typedef void (^MyCompletionBlock)(id obj1, id obj2);

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

-(void)doThisWithBlock:(MyCompletionBlock)block;

В файле m я объявил метод

-(void)doThisWithBlock:(MyCompletionBlock)block {
    NSLog(@"Something");
}

и когда я позвонил, я получил причудливое завершение кода вот так. CodeCompletion1

CodeCompletion2

Надеюсь, это ответит на ваш вопрос.

1 голос
/ 19 июня 2013

Хорошо, так что я нашел способ сделать это с помощью временного интервала, который не приводит к предупреждениям / ошибкам ... и на самом деле делает вещи проще для чтения / для сокращения,и т. д.

определить макрос с нашим «сокращением», а затем использовать полный формат в объявлении свойства, как ...

#define TINP NSString*(^)(NSString *typed, const char *raw)
@interface ....
@property (copy) NSString*(^termDidReadString)(NSString *typed, const char *raw);

впоследствии .. затем вы можете ссылаться на этот «вид»"аргумент и т. д. как ..

+ (void)addInputBlock:(TINP)termDidReadString;

и вуаля ... не только ваш код будет TINIER !!но завершение кода будет работать, как талисман ...

enter image description here

0 голосов
/ 29 февраля 2012

Я не знаю о полных дополнениях кода, но вы можете использовать фрагменты кода для получения завершения кода, например поведения, и использовать заполнители в фрагментах кода <#PLACE HOLDER #>. Надеюсь, это поможет вам

...