【问题标题】:Xcode omitting parameters names of blockXcode省略块的参数名称
【发布时间】:2013-01-21 14:06:08
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

  • 但是indexChangeBlock的类型只是void (^)(NSInteger)。函数类型或块类型中没有“参数名称”。它对语言没有意义。
  • 是的,它对语言没有意义,但它对于 Xcode 中的自动完成很有用,特别是当您的代码将被其他人使用时。
  • FWIW,我刚刚在 Xcode 12.5.1 中测试了上述语法,现在自动完成确实包含了参数名称。
  • 很高兴知道它已在 8 年后修复。

标签: ios objective-c xcode block


【解决方案1】:

可能的解决方案:

typedef void (^IndexChangeBlock)(NSInteger index);

并使用

定义您的属性
@property (nonatomic, copy) IndexChangeBlock indexChangeBlock;

如果你添加

- (void)setIndexChangeBlock:(IndexChangeBlock)indexChangeBlock;

一切正常

【讨论】:

  • Xcode 会自动补全到[self.segmentedControl3 setIndexChangeBlock:(IndexChangeBlock)indexChangeBlock],所以更烦人。
  • 编辑了我的答案,遗憾的是你必须手动添加 setter-declaration
  • 现在像魅力一样工作,谢谢!还值得一提的是,它也可以在没有 typedef 的情况下工作。只需 - (void)setIndexChangeBlock:(void (^)(NSInteger index))indexChangeBlock; 的属性和 setter 方法即可。
【解决方案2】:

在更加沮丧的情况下,我做了一个宏来巩固这个粗略的过程..

#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 AND 中受益,并且您不必创建难看的、理论上不需要的 setter 声明!

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

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

BlockProp(OnEvent,anotherVar,AnotherVar);

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

【讨论】:

    猜你喜欢
    • 2017-10-28
    • 1970-01-01
    • 2012-02-05
    • 2013-10-06
    • 2021-10-24
    • 1970-01-01
    • 2011-06-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多