否定存储在NSNumber中的布尔值

dre*_*ish 3 boolean objective-c nsnumber

我有一个带有NSNumber的托管对象,它只是一个布尔值.当用户单击按钮时,我想切换它.

self.item.completed = [NSNumber numberWithBool:![self.item.completed boolValue]];
Run Code Online (Sandbox Code Playgroud)

我缺少一种更干净(或者可能更紧凑)的方式吗?

das*_*ght 6

您可以对产生否定值的过程做很少的事情,但是通过将代码隐藏在类别中,您可以使调用它的语法看起来不那么笨重:

@interface NSNumber ( NegateBoolean )
-(NSNumber)negateBool;
@end

@implementation NSNumber ( NegateBoolean )
-(NSNumber)negateBool{
    return [NSNumber numberWithBool:![self boolValue]];
}
@end
Run Code Online (Sandbox Code Playgroud)

现在你可以使用这样的新方法:

self.item.completed = [self.item.completed negateBool];
Run Code Online (Sandbox Code Playgroud)

您还可以设置NSArray反转,并按如下方式使用它:

NSArray *inversions = [NSArray arrayWithObjects:[NSNumber numberWithBool:YES], [NSNumber numberWithBool:NO], nil];
self.item.completed = [inversions objectAtIndex:[self.item.completed boolValue]];
Run Code Online (Sandbox Code Playgroud)

  • 使用现代objective-c,类别方法可以缩短为返回@(!self.boolValue); (3认同)