我有一个带有NSNumber的托管对象,它只是一个布尔值。当用户单击按钮时,我想切换它。
self.item.completed = [NSNumber numberWithBool:![self.item.completed boolValue]];
我缺少一种更干净(或者更紧凑)的方式吗?
答案 0 :(得分: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];
您还可以设置带有反转的NSArray
,并按如下方式使用它:
NSArray *inversions = [NSArray arrayWithObjects:[NSNumber numberWithBool:YES], [NSNumber numberWithBool:NO], nil];
self.item.completed = [inversions objectAtIndex:[self.item.completed boolValue]];
答案 1 :(得分:4)
您可以考虑在self.item
上为completedValue
设置一个“包装器”getter和setter,用于处理BOOL
s而不是NSNumbers的属性- (BOOL)completedValue {
return [self.completed boolValue];
}
- (void)setCompletedValue:(BOOL)value {
self.completed = [NSNumber numberWithBool:value];
}
。可能看起来有点像:
self.item.completedValue = !self.item.completedValue;
然后你的电话就变成了:
{{1}}
答案 2 :(得分:1)
在NSNumber上不使用其他类别方法的另一种方法是使用三元运算符和NSNumber boolean literals:
self.item.completed = self.item.completed.boolValue ? @NO : @YES;
这适用于任何最新版本的Xcode,但特别需要LLVM v4.0或clang v3.1。