ブール値であるNSNumberを持つ管理対象オブジェクトがあります。ユーザーがボタンをクリックすると、それを切り替えたいと思います。
self.item.completed = [NSNumber numberWithBool:![self.item.completed boolValue]];
私が見逃しているよりクリーンな(またはおそらくもっとコンパクトな)方法はありますか?
ブール値であるNSNumberを持つ管理対象オブジェクトがあります。ユーザーがボタンをクリックすると、それを切り替えたいと思います。
self.item.completed = [NSNumber numberWithBool:![self.item.completed boolValue]];
私が見逃しているよりクリーンな(またはおそらくもっとコンパクトな)方法はありますか?
否定された値を生成するプロセスに対してできることはほとんどありませんが、コードをカテゴリに非表示にすることで、それを呼び出す構文がかさばらないようにすることができます。
@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
with inversions を設定して、次のように使用することもできます。
NSArray *inversions = [NSArray arrayWithObjects:[NSNumber numberWithBool:YES], [NSNumber numberWithBool:NO], nil];
self.item.completed = [inversions objectAtIndex:[self.item.completed boolValue]];
NSNumbers の代わりに s を扱うself.item
、おそらく と呼ばれるプロパティに対して、「ラッパー」ゲッターとセッターを設定することを検討できます。少し似ているかもしれません:completedValue
BOOL
- (BOOL)completedValue {
return [self.completed boolValue];
}
- (void)setCompletedValue:(BOOL)value {
self.completed = [NSNumber numberWithBool:value];
}
次に、呼び出しは次のようになります。
self.item.completedValue = !self.item.completedValue;
NSNumber で追加のカテゴリ メソッドを使用せずにこれにアプローチする別の方法は、三項演算子とNSNumber ブール値リテラルを使用することです。
self.item.completed = self.item.completed.boolValue ? @NO : @YES;
これは Xcode の最近のバージョンで動作するはずですが、特に LLVM v4.0 または clang v3.1 が必要です。