【问题标题】:difficulty understanding this part of block programming难以理解块编程的这一部分
【发布时间】:2012-10-24 10:45:48
【问题描述】:

这是来自apple blocks docs,我很难理解,请任何人解释一下

如果你没有显式声明一个块的返回值 表达式,它可以从内容中自动推断出来 堵塞。如果返回类型被推断并且参数列表为空, 那么您也可以省略 (void) 参数列表。如果或何时 存在多个返回语句,它们必须完全匹配(使用 必要时进行铸造)。

【问题讨论】:

  • 以上三个句子中的哪个句子你有困难?

标签: ios objective-c objective-c-blocks


【解决方案1】:

1) 如果不显式声明块表达式的返回值,可以从 块

void ^(float aFloat) {
   printf("value is :%f",aFloat);
};

也可以写成

^(float aFloat) {
   printf("value is :%f",aFloat);
};

不说返回类型。返回类型是自动推断的。对于返回非 void 值的块来说是这样。

2) 如果返回类型是推断出来的并且参数列表是void,那么你也可以省略(void)参数列表

这有点难以理解和混淆,因为文档特别说明了

不带参数的块必须在参数中指定 void 列表。

我相信这种积木是可能的。

 ^{
     printf("Hello world");
 }

推断返回值的位置,因此不需要 void。我不确定这一点,所以想澄清一下。

3) 如果或当存在多个返回语句时,它们必须完全匹配(必要时使用强制转换)。

简单地说,一个块必须只返回一种类型的数据。它不能返回 int float。

【讨论】:

  • ^{ printf("Hello world"); } 也足够了。
  • 那么不带参数的块必须在参数列表中指定void。错了吗?
  • 但这给出了一个错误 void ^(float aFloat) { printf("value is :%f",aFloat); };
  • 这给出了未使用的表达式结果 ^(float aFloat) { printf("value is :%f",aFloat); };
  • @S.J 那是因为printf() 返回一个int。编译器告诉你它已经推断出一个 int 的返回值,但你没有使用它。我相信这也适用于回答者的第 2 点
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 2011-01-20
  • 2019-06-01
  • 2017-10-24
  • 2013-01-05
  • 2022-12-13
相关资源
最近更新 更多