7

次のようなブロックプロパティがあります。

@property (nonatomic, copy) void (^indexChangeBlock)(NSInteger index);

このプロパティの値を設定しようとすると、Xcodeオートコンプリートはパラメーター名を省略し、次のようなものを残します。

[self.segmentedControl3 setIndexChangeBlock:^(NSInteger) {
    code
}];

次に、XcodeはParameter name omittedエラーを表示します。パラメータ名を手動で追加して次のようにすることで、これを解決できることを認識しています。

[self.segmentedControl3 setIndexChangeBlock:^(NSInteger index) {
    code
}];

私の質問は、Xcodeにパラメータ名を自動的に追加させる方法です。つまり、それらが削除されないようにします。

4

2 に答える 2

3

考えられる解決策:

typedef void (^IndexChangeBlock)(NSInteger index);

とあなたのプロパティを定義します

@property (nonatomic, copy) IndexChangeBlock indexChangeBlock;

そしてあなたが追加した場合

- (void)setIndexChangeBlock:(IndexChangeBlock)indexChangeBlock;

すべてが機能するはずです

于 2013-01-21T14:09:34.170 に答える
1

悪化した欲求不満の中で、私はこの全体的なプロセスを統合するマクロを作成しました。

#define BlockProperty(SIGNATURE,TYPENAME,varname,Varname) typedef SIGNATURE; @property (nonatomic,copy) TYPENAME varname; - (void) set##Varname:(TYPENAME)_

これで、以前は必要だったもの(適切なオートコンプリートのため)。

typedef void(^OnEvent)(BOOL ok,id result);
@property (nonatomic,copy) OnEvent varname;
- (void) setVarname:(OnEvent)_;

単に

BlockProperty(void(^OnEvent)(BOOL ok, id result),OnEvent,varname,VarName);

かなり簡単で冗長性が少なく、typedefのメリットが得られ、見苦しい、理論的には不要なセッター宣言を作成する必要がありません。

「タイプ」を再利用したい場合は、別のタイプが必要になります(今回は、3つのパラメーターのみを取ります(ブロックタイプは再宣言できないため)。

#define BlockProp(TYPENAME,varname,Varname) @property (nonatomic,copy) TYPENAME varname; - (void)  set##Varname:(TYPENAME)_

BlockProp(OnEvent,anotherVar,AnotherVar);

(最初のマクロを使用して)署名が一致している場合でも、プロパティごとに新しいブロックタイプ(名前)を作成することもできますが、それは一種の大雑把です。楽しみ!

于 2014-09-30T05:20:10.250 に答える