【问题标题】:understand block on programming with object C [closed]了解使用对象 C 进行编程的块 [关闭]
【发布时间】:2014-02-02 18:43:12
【问题描述】:

关于教程编程与ObjectiveC。

following code 让我很困惑:

自定义类型定义在处理返回块或将其他块作为参数的块时特别有用。考虑以下示例:

void (^(^complexBlock)(void (^)(void)))(void) = ^ (void (^aBlock)(void)) {
    ...
    return ^{
        ...
    };
};

complexBlock 变量指的是一个将另一个块作为参数 (aBlock) 并返回另一个块的块。

重写代码以使用类型定义使其更具可读性:

typedef void (^XYZSimpleBlock)(void);
XYZSimpleBlock (^betterBlock)(XYZSimpleBlock) = ^ (XYZSimpleBlock aBlock) {
    ...
    return ^{
        ...
    };
};

我理解重写代码: 但我看不懂源代码:

void (^(^complexBlock)(void (^)(void)))(void) = ^ (void (^aBlock)(void)) {
    ...
    return ^{
        ...
    };
}

按照我的理解应该是:

(void (^) (void)) (^complexBlock) (void (^)(void) = ^ (void (^aBlock)(void)) {
    ...
    return ^{
        ...
    };
};

【问题讨论】:

  • 当然这很令人困惑。这是一个 C 声明!它们很难阅读,而且一直如此。 :)
  • in my understand, it should be: - 不,为什么不呢?你肯定知道块的声明类似于函数。这不是函数返回类型声明的工作方式。读一本 C 书。

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


【解决方案1】:

块使用类似于用于声明指向函数的指针的语法声明,不同之处在于您使用^而不是*

因此,函数类比将是“指向返回函数指针的函数的指针”, 在这里很好地解释了这一点:https://stackoverflow.com/a/10759352/1187415.

如果您将该答案的“构建过程”翻译为您的块 然后你得到:

复杂块——复杂块 ^complexBlock -- 是一个块 (^complexBlock)(void (^)(void)) -- 取一个块参数 ^(^complexBlock)(void (^)(void)) -- 返回一个块 (^(^complexBlock)(void (^)(void)))(void) -- 不带参数 void (^(^complexBlock)(void (^)(void)))(void) -- 返回 void

更一般地说,有一种技术称为 "Clockwise/Spiral Rule" 您可以使用它来“解析”C 声明。螺旋法则有效 也适用于块。

或者使用cdecl C gibberish ↔ English,在your case 返回

将 complexBlock 声明为块(块(void)返回 void)返回 块(无效)返回无效

【讨论】:

  • 请注意 Martin R 如何从内到外发展他对声明的解释,从中间(名称)开始,然后从那里向外:向左一步,向右一步,向左一步,右一步,左一步。这就是如何读/写 C 类型声明。这就是块类型声明的全部内容。
  • @matt:它被称为“螺旋规则”(添加到答案的链接)。
  • 很好的答案,马丁。这是对螺旋规则的另一个很好的参考,适用于 Objective-C 块语法nilsou.com/blog/2013/08/21/objective-c-blocks-syntax
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-28
  • 1970-01-01
  • 2011-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多