3

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

self.item.completed = [NSNumber numberWithBool:![self.item.completed boolValue]];

有没有我想念的更清洁(或者可能只是更紧凑)的方式?

4

3 回答 3

6

对于产生否定值的过程,您几乎无能为力,但您可以通过将代码隐藏在一个类别中来使调用它的语法看起来不那么笨重:

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

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

现在您可以像这样使用新方法:

self.item.completed = [self.item.completed negateBool];

您还可以设置一个NSArraywith inversions,并按如下方式使用它:

NSArray *inversions = [NSArray arrayWithObjects:[NSNumber numberWithBool:YES], [NSNumber numberWithBool:NO], nil];
self.item.completed = [inversions objectAtIndex:[self.item.completed boolValue]];
于 2012-08-03T19:10:50.387 回答
4

self.item您可以考虑为一个属性(可能称为)设置一个“包装器”getter 和 setter completedValue,它处理BOOLs 而不是 NSNumbers。可能看起来有点像:

- (BOOL)completedValue {
    return [self.completed boolValue];
}

- (void)setCompletedValue:(BOOL)value {
    self.completed = [NSNumber numberWithBool:value];
}

然后你的电话就变成了:

self.item.completedValue = !self.item.completedValue;
于 2012-08-03T18:40:33.540 回答
1

在 NSNumber 上不使用其他类别方法的另一种方法是使用三元运算符和NSNumber 布尔文字

self.item.completed = self.item.completed.boolValue ? @NO : @YES;

这应该适用于任何最新版本的 Xcode,但特别是它需要 LLVM v4.0 或 clang v3.1。

于 2016-10-27T16:48:11.583 回答