2

当我查看下划线项目的 src 时,我发现该块对我来说有点全面:

typedef BOOL (^UnderscoreTestBlock)(id obj);

在类中,它定义了这个类方法:

+ (UnderscoreTestBlock (^)(UnderscoreTestBlock))negate
{
    return ^UnderscoreTestBlock (UnderscoreTestBlock test) {
        return ^BOOL (id obj) {
            return !test(obj);
        };
    };
}

以及如何理解这些代码,谢谢!

4

1 回答 1

4

我认为你做对了。negate是一个返回块的类方法。返回的块接受一个UnderscoreTestBlock参数并返回另一个UnderscoreTestBlock。例子:

UnderscoreTestBlock isANumber = ^BOOL (id obj) {
    return [obj isKindOfClass:[NSNumber class]];
};
BOOL b1 = isANumber(@123);       // YES
BOOL b2 = isANumber(@"abc");     // NO

UnderscoreTestBlock isNotANumber = [Underscore negate](isANumber);
BOOL b3 = isNotANumber(@123);   // NO
BOOL b4 = isNotANumber(@"abc"); // YES

[Underscore negate]返回一个使用isANumber参数调用的块。该调用的返回值是块

^BOOL (id obj) { return !test(obj); };

wheretest是由块捕获isANumber的参数。


我确信 Underscore 项目定义这样的方法是有充分理由的negate ,这可能是它们的“功能”符号所必需的。否则一个稍微简单的方法是定义一个方法

+ (UnderscoreTestBlock)negateBlock:(UnderscoreTestBlock)test
{
    return ^BOOL (id obj) {
        return !test(obj);
    };
}

这将像

UnderscoreTestBlock isNotANumber = [Underscore negateBlock:isANumber];
于 2013-09-16T08:50:34.150 回答