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

NSNumbers の代わりに s を扱うself.item、おそらく と呼ばれるプロパティに対して、「ラッパー」ゲッターとセッターを設定することを検討できます。少し似ているかもしれません:completedValueBOOL

- (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 に答える