Objective-C 块参数问题:该块声明不是原型。

10

我正在学习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不支持这种语法。 我想知道如何解决它,以及原因是什么。

提前感谢。

2个回答

20

如果你试图使用一个空括号()来定义函数或块原型,你会收到“非原型”警告。

在括号的中间加上void,例如(id _Nullable (^)(void)),这样就可以解决问题了。


1
@dengApro 你试过了吗?在最近的Xcode版本中,Clang的默认警告设置变得更加严格了。将void放在括号中应该可以解决这个问题。 - Charles Srstka
2
@dengApro 然后只需将其定义为可变参数,就像 -[NSString stringWithFormat:] 一样,使用省略号。 (id _Nullable (^)(NSString *, ...)) - Charles Srstka
1
@dengApro:补充一下CharlesSrstka的评论,如果你使用带有可变参数的块类型,则块实现需要实际上采用可变参数。类型必须与块签名匹配。如果您尝试使用与运行时指向的块的实际签名不匹配的块类型调用块表达式,则会导致未定义的行为。 - newacct
@newacct,我想你可以发表一个回答,并展示一些代码。 - dengApro
1
@dengApro 这里有一个 C 语言中可变参数函数的简短示例 - Charles Srstka
显示剩余4条评论

0

如果您重新定义签名以接受数组而不是任意数量的参数,则可以轻松解决此问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接