1

有没有人对为什么块参数有一些见解

- (void)enumerateMatchesInString:(NSString *)string
                         options:(NSMatchingOptions)options
                           range:(NSRange)range
                      usingBlock:(void (^)(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop))block

通过stop引用而不是返回它?

在我看来,您可以使用返回值来表示我缺少某些东西并且我想知道我缺少什么,这对我来说似乎是“显而易见的”。(我能想到的唯一一件事是您可以为通过引用变量提供一个名称,以使它们的含义更清楚。)

4

1 回答 1

2

我的猜测是因为stop不一定需要该功能,并且使块返回void使语法更轻,因为您可以从代码的末尾掉下来返回:

usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) {
    NSLog(@"result: %@", result);
}];

而不是:

usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags) {
    NSLog(@"result: %@", result);
    return YES;
}];

此外,正如您所指出的,还有一个清晰的问题。如果不检查文档,就很难判断返回值对这里的枚举意味着什么。(另外,说到块返回值:我的-[NSArray collectResultsUsingBlock:]方法在哪里?)

一个额外的次要因素可能是BOOL类型在很长一段时间内不能很好地与块类型推断配合使用,所以这是:

usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags) {
    return YES;
}];

会引发类型错误,要求您执行以下任一操作:

return (BOOL)YES;

或者:

usingBlock:^BOOL (NSTextCheckingResult…

为了让一切顺利。

这一切都只是等级推测。文件似乎对此事保持沉默;Cocoa的编码指南似乎没有更新,甚至包括 Apple 似乎在内部采用的标准化工作,例如始终在原型声明中为块参数提供名称。

于 2013-08-10T00:51:10.170 回答