it-swarm.com.ru

Свойство блока Objective-C с завершением кода Xcode

Можно ли определить свойство блока 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 {...}

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

Спасибо!

29
Andrew

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

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

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

...

@property (nonatomic, copy) CompletionBlock completionBlock;

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

- (void)setCompletionBlock:(CompletionBlock)completionBlock;

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

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

34
Matt

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

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

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

-(void)doThisWithBlock:(MyCompletionBlock)block;

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

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

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

CodeCompletion2

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

4
MobileOverlord

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

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

#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

1
Alex Gray

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

0
Apps 4 U