我认为你做对了。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];