2012-08-03 45 views
3

我有一個管理對象,它的NSNumber只是一個布爾值。當用戶點擊一個按鈕時,我想切換。取消存儲在NSNumber中的布爾值

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

有沒有一個更清潔(或可能更緊湊)的方式,我失蹤了?

回答

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]]; 
+3

隨着現代Objective-C的類別方法可以縮短到返回@(!self.boolValue); – DonnaLea 2014-05-16 00:43:57

+0

P.S.我總是喜歡它,當我看到類別的答案:) – DonnaLea 2014-05-16 00:45:30

4

您可以考慮在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; 
+0

這是一個很好的建議。我很好奇,如果有一個更簡單的方法來做否定,或者如果這只是Objective-C的一個奇怪的問題,我必須學會去愛。 – drewish 2012-08-03 18:51:47

+0

我想你可能會卡在那裏。對不起:) – Tim 2012-08-03 21:19:18

1

另一種方式來處理這個不上的NSNumber使用其他類別的方法是使用三元運算和在NSNumber boolean literals

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

這應該與任何新版本的Xcode的工作,但特別它需要LLVM V4.0或鐺V3.1。