我有一个看起来像这样的块属性:
@property (nonatomic, copy) void (^indexChangeBlock)(NSInteger index);
当我尝试设置此属性的值时,Xcode自动完成将省略参数名称,留下我这样的内容:
[self.segmentedControl3 setIndexChangeBlock:^(NSInteger) {
code
}];
然后Xcode显示Parameter name omitted
错误。我知道我可以通过手动添加参数名来解决这个问题,使它看起来像这样:
[self.segmentedControl3 setIndexChangeBlock:^(NSInteger index) {
code
}];
我的问题是,如何让Xcode自动添加参数名称。或者换句话说,防止它被删除。
答案 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);
你可以为每个属性创建一个新的块类型(名称),即使它们的签名匹配(使用第一个宏),但这有点粗略。享受!