Xcode省略了块的参数名称

时间:2013-01-21 14:06:08

标签: iphone ios xcode block

我有一个看起来像这样的块属性:

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

当我尝试设置此属性的值时,Xcode自动完成将省略参数名称,留下我这样的内容:

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

然后Xcode显示Parameter name omitted错误。我知道我可以通过手动添加参数名来解决这个问题,使它看起来像这样:

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

我的问题是,如何让Xcode自动添加参数名称。或者换句话说,防止它被删除。

2 个答案:

答案 0 :(得分:2)

可能的解决方案:

typedef void (^IndexChangeBlock)(NSInteger index);

并使用

定义您的媒体资源
@property (nonatomic, copy) IndexChangeBlock indexChangeBlock;

如果你添加

- (void)setIndexChangeBlock:(IndexChangeBlock)indexChangeBlock;

一切都应该有效

答案 1 :(得分: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的好处,而且您不必创建难看的,理论上不需要的setter声明!

如果您想重复使用"类型"你需要另一个(这次只需要三个参数(因为块类型不能重新声明)。

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

BlockProp(OnEvent,anotherVar,AnotherVar);

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