свойство блока objective-c с завершением кода xcode

<p>можно ли определить свойство блока objective c, но все еще иметь полное завершение кода в xcode 4?</p><p>если я использую typedef, чтобы определить блок:</p><p><code>typedef void (^completionblock)(myobject *myobj);</code></p><p>а затем определить свойство:</p><p><code>@property (nonatomic, copy) completionblock completionblock;</code></p><p>а затем <code>@synthesize</code> свойство я не получаю полное завершение кода при вызове установщика. xcode будет использовать typedef, и поэтому при завершении кода не используется полный синтаксис блока с параметрами блока, а используется typedef.</p><p>если я определю прототип метода в заголовке, который использует полный синтаксис блока вместо typedef:</p><p><code>@property (nonatomic, copy) void (^completionblock)(myobject *myobj);</code></p><p>и затем я использую <code>@synthesize</code>, предоставляемый установщик приближается к использованию полного синтаксиса завершения кода, но принципиально он пропускает имена параметров:</p><p><code>[self setcompletionblock:(void (^)(myobject *)) { ... }</code></p><p>наконец, если я попытаюсь <code>@synthesize</code> и затем переопределю реализацию сеттера или поместу прототип в заголовок:</p><p><code>- (void)setcompletionblock:(void (^)(myobject *myobj))completionblock {...}</code></p><p>выдается предупреждение о том, что тип свойства не соответствует типу метода доступа. независимо от того, как я пытаюсь определить синтаксис, я не могу определить свойство блока и метод установки, который имеет полный синтаксис для завершения кода. могу ли я взять свой торт и съесть его тоже?</p><p>спасибо!</p>

<p>вы, безусловно, можете съесть свой торт и съесть его, если хотите добавить еще одну строчку кода в интерфейс вашего класса.</p><p>сначала определите блок с помощью typedef и создайте свойство, как вы делали в своем вопросе:</p><pre><code>typedef void (^completionblock)(myobject *myobj); ... @property (nonatomic, copy) completionblock completionblock; </code></pre><p>далее, как mobileoverload указал в своем ответе, мы знаем, что xcode обеспечивает правильное завершение кода для блоков typedef'd, если используется в объявлении автономного метода. итак, давайте добавим явное объявление для установщика <code>completionblock</code>:</p><pre><code>- (void)setcompletionblock:(completionblock)completionblock; </code></pre><p>при вызове этот метод преобразуется в метод установки, объявленный свойством. однако, поскольку мы явно определили это в интерфейсе класса, xcode видит это и применяет полное завершение кода.</p><p>итак, если вы включите все три из этих строк, вы должны получить желаемый результат. такое поведение явно является недостатком xcode, поскольку нет причины, по которой метод определения, определенный в операторе <code>@property</code>, должен иметь завершение кода, отличное от того же самого метода, определенного самостоятельно.</p>

<p>вы можете получить необычное завершение кода при передаче своих блоков в качестве аргумента методу в вашем классе. в заголовочном файле я ввожу определение блока как это</p><pre><code>typedef void (^mycompletionblock)(id obj1, id obj2); </code></pre><p>затем я смог использовать его в качестве аргумента для моего метода, который я также объявил в этом заголовке класса.</p><pre><code>-(void)dothiswithblock:(mycompletionblock)block; </code></pre><p>в файле m я объявил метод</p><pre><code>-(void)dothiswithblock:(mycompletionblock)block { nslog(@"something"); } </code></pre><p>и когда я пошел, чтобы позвонить, я получил причудливое завершение кода, как это . <img src="https://i.stack.imgur.com/bx5dx.png" alt="codecompletion1"></p><p><img src="https://i.stack.imgur.com/0hzuk.png" alt="codecompletion2"></p><p>надеюсь, это ответит на ваш вопрос.</p>

<p>итак, я нашел способ сделать это с помощью временного ограничения, который не приводит к предупреждениям/ошибкам ...<em> и </em>на самом деле делает вещи<em> проще </em>читается/короче печатает и т.д.</p><p>определить макрос с нашим «сокращением», а затем использовать полный формат в объявлении свойства, как ...</p><pre><code>#define tinp nsstring*(^)(nsstring *typed, const char *raw) @interface .... @property (copy) nsstring*(^termdidreadstring)(nsstring *typed, const char *raw); </code></pre><p>впоследствии .. затем вы можете ссылаться на этот «вид» аргумента и т. д. как….</p><pre><code>+ (void)addinputblock:(tinp)termdidreadstring; </code></pre><p>и вуаля ... не только ваш код будет tinier !! но завершение кода будет работать, как шарм ...</p><p><img src="https://i.stack.imgur.com/qyyhs.png" alt="enter image description here"></p>

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