【问题标题】:Objective-C block parameter Issue: This block declaration is not a prototypeObjective-C 块参数问题:这个块声明不是原型
【发布时间】:2017-12-21 01:18:37
【问题描述】:

我正在学习ReactiveObjC,ReactiveCocoa Objective-C 版本。

对于下面的代码:在RACSignal.h

- (RACSignal *)reduceEach:(id _Nullable (^)())reduceBlock RAC_WARN_UNUSED_RESULT;

(id _Nullable (^)())

Xcode 报错:

这个块声明不是原型

多个参数可以放在reduceBlock() 中。 如下代码:在UIAlertView+RACSignalSupport.m等中,

- (RACSignal *)rac_buttonClickedSignal {
    RACSignal *signal = [[[[self.rac_delegateProxy
        signalForSelector:@selector(alertView:clickedButtonAtIndex:)]
        reduceEach:^(UIAlertView *alertView, NSNumber *buttonIndex){
            return buttonIndex;
        }]
    ......
    return signal;
}

有点通用。我想我可以在块中放入零个或多个参数,并声明 void (^block)()

Xcode 现在不支持该语法。 我想知道如何解决它,以及为什么。

非常感谢。

【问题讨论】:

    标签: ios objective-c block


    【解决方案1】:

    当您尝试使用一组空括号 () 定义函数或块原型时,可能会收到“不是原型”警告。

    在括号中间放一个void——即(id _Nullable (^)(void)),你应该解决这个问题。

    【讨论】:

    • 我想,答案是那样的`(id _Nullable (^)(id _Nullable ,...))`,没那么容易。 (id _Nullable(^)()),这个语法我看了很多遍。
    • @dengApro 你试过了吗? Xcode 中 Clang 的默认警告设置在最近的版本中对此更加严格。将void 放在括号中确实应该解决它。
    • @dengApro 然后将其定义为可变参数,就像-[NSString stringWithFormat:] 所做的那样,使用省略号。 (id _Nullable (^)(NSString *, ...))
    • @dengApro:添加到 CharlesSrstka 的评论中,如果您使用带有可变参数参数的块类型,那么块实现实际上需要采用可变参数。类型必须与块签名匹配。如果您尝试调用具有与其在运行时指向的块的实际签名不匹配的块类型的块表达式,则会导致未定义的行为。
    【解决方案2】:

    如果您重新定义签名以接受数组而不是任意数量的参数,那么您将轻松解决它

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多