Iphone Xcode省略块的参数名称

Iphone Xcode省略块的参数名称,iphone,ios,xcode,block,Iphone,Ios,Xcode,Block,我有一个块属性,如下所示: @property (nonatomic, copy) void (^indexChangeBlock)(NSInteger index); [self.segmentedControl3 setIndexChangeBlock:^(NSInteger) { code }]; [self.segmentedControl3 setIndexChangeBlock:^(NSInteger index) { code }]; 当我尝试设置此属性的值时

我有一个块属性,如下所示:

@property (nonatomic, copy) void (^indexChangeBlock)(NSInteger index);
[self.segmentedControl3 setIndexChangeBlock:^(NSInteger) {
    code
}];
[self.segmentedControl3 setIndexChangeBlock:^(NSInteger index) {
    code
}];
当我尝试设置此属性的值时,Xcode autocomplete将忽略参数名,留下如下内容:

@property (nonatomic, copy) void (^indexChangeBlock)(NSInteger index);
[self.segmentedControl3 setIndexChangeBlock:^(NSInteger) {
    code
}];
[self.segmentedControl3 setIndexChangeBlock:^(NSInteger index) {
    code
}];
然后Xcode显示一个省略的
参数名
错误。我知道我可以通过手动添加参数名来解决这个问题,使其看起来像这样:

@property (nonatomic, copy) void (^indexChangeBlock)(NSInteger index);
[self.segmentedControl3 setIndexChangeBlock:^(NSInteger) {
    code
}];
[self.segmentedControl3 setIndexChangeBlock:^(NSInteger index) {
    code
}];
我的问题是,如何让Xcode自动添加参数名。或者换句话说,防止它将其移除。

可能的解决方案:

typedef void (^IndexChangeBlock)(NSInteger index);
并使用

@property (nonatomic, copy) IndexChangeBlock indexChangeBlock;
如果你加上

- (void)setIndexChangeBlock:(IndexChangeBlock)indexChangeBlock;

一切都应该顺利

在更加沮丧的情况下,我制定了一个宏观计划来巩固这一总体过程

#define BlockProperty(SIGNATURE,TYPENAME,varname,Varname) typedef SIGNATURE; @property (nonatomic,copy) TYPENAME varname; - (void) set##Varname:(TYPENAME)_
现在是以前需要的(正确的自动完成)

只是

BlockProperty(void(^OnEvent)(BOOL ok, id result),OnEvent,varname,VarName);
非常简单,不太冗长,而且您可以从typedef中获益,并且不必创建难看的、理论上不需要的setter声明

如果要重用一个“类型”,则需要另一个(这一次只需要三个参数(因为无法重新声明块类型)


您可以为每个属性创建一个新的块类型(名称),即使它们的签名匹配(使用第一个宏),但这有点粗糙。尽情享受吧!

Xcode将自动完成该操作,以
[self.segmentedControl3 setIndexChangeBlock:(IndexChangeBlock)IndexChangeBlock]
,所以它更烦人。编辑了我的答案,很遗憾,您现在必须手动添加setter声明,非常有效,谢谢!还值得一提的是,它在没有typedef的情况下也可以工作。只有属性和setter方法
-(void)setIndexChangeBlock:(void(^)(NSInteger index))indexChangeBlock;
可以。但是
indexChangeBlock
的类型只是
void(^)(NSInteger)
。没有“参数名”在函数类型或块类型中。它对语言没有意义。是的,它对语言没有意义,但对于Xcode中的自动完成非常有用,特别是当您的代码将被其他人使用时。