我有一個管理對象,它的NSNumber只是一個布爾值。當用戶點擊一個按鈕時,我想切換。取消存儲在NSNumber中的布爾值
self.item.completed = [NSNumber numberWithBool:![self.item.completed boolValue]];
有沒有一個更清潔(或可能更緊湊)的方式,我失蹤了?
我有一個管理對象,它的NSNumber只是一個布爾值。當用戶點擊一個按鈕時,我想切換。取消存儲在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
,並且按如下方式使用它:
NSArray *inversions = [NSArray arrayWithObjects:[NSNumber numberWithBool:YES], [NSNumber numberWithBool:NO], nil];
self.item.completed = [inversions objectAtIndex:[self.item.completed boolValue]];
您可以考慮在self.item
上設置一個「封裝」吸氣器和設置器,該器件可能被稱爲completedValue
,它在BOOL
中代替NSNumber。可能看起來有點像:
- (BOOL)completedValue {
return [self.completed boolValue];
}
- (void)setCompletedValue:(BOOL)value {
self.completed = [NSNumber numberWithBool:value];
}
然後你的電話剛剛變爲:
self.item.completedValue = !self.item.completedValue;
另一種方式來處理這個不上的NSNumber使用其他類別的方法是使用三元運算和在NSNumber boolean literals:
self.item.completed = self.item.completed.boolValue ? @NO : @YES;
這應該與任何新版本的Xcode的工作,但特別它需要LLVM V4.0或鐺V3.1。
隨着現代Objective-C的類別方法可以縮短到返回@(!self.boolValue); – DonnaLea 2014-05-16 00:43:57
P.S.我總是喜歡它,當我看到類別的答案:) – DonnaLea 2014-05-16 00:45:30