2010-03-19 78 views
46

首先,我將BOOL值轉換爲NSNumber,以便將其放入NSUserDefaults中。後來我想從NSUserDefaults中檢索BOOL值,但顯然我得到了NSNumber而不是BOOL。我的問題是?如何轉換和比較NSNumber BOOL?

  1. 如何將NSNumber轉換回BOOL?
  2. 如何將NSNumber與BOOL值進行比較。

目前我有:

if (someNSNumberValue == [NSNumber numberWithBool:NO]) { 
    do something 
} 

什麼更好的辦法向比較呢?

謝謝!

+1

也許,也許只是讀[NSNumber規範](https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSNumber_Class/Reference/Reference.html)? ? – 2013-07-09 20:34:53

+2

@HotLicks我明白你對過於簡單和未經研究的問題感到憤怒。但對於我們那些經驗豐富的提供真實布爾數據類型的現代語言的人來說,模擬C和Objective-C中的布爾值是非常令人困惑的 - 遠非如此。 – 2013-08-25 21:24:30

回答

127

您目前比較兩個指針。使用NSNumber小號方法,而不是實際的比較之二:

BOOL b = [num boolValue]; 

用的比較會更容易閱讀對我來說是這樣的:

​​

要從NSNumber使用-(BOOL)boolValue得到布爾值:

if([num boolValue] == NO) { 
    // ... 
} 
+0

太棒了!現在我明白它應該如何工作。非常感謝! – Jakub 2010-03-20 16:32:37

+0

@GeorgFritzsche我建議你將第二個剪在第一個之上,並主要推薦它的使用。第一個是「低效率」 - 我不想在這裏做過早的優化,但爲什麼要創建一個多餘的'NSNumber'實例? – 2013-07-09 17:43:59

+0

@ H2CO3:看看來自OP的原始片段,我首先回應,從那裏獲得更好的選擇。 – 2013-07-09 18:25:41

1

NSUserDefaults有兩種方法可以透明地與布爾操作:

- (BOOL)boolForKey:(NSString *)defaultName

- (void)setBool:(BOOL)value forKey:(NSString *)defaultName

0

的唯一途徑,我設法從NSConcreteValue欺騙一個NSNumber的 「布爾度」(DOH!)與下面...

id x = [self valueForKey:@"aBoolMaybe"]; 
if ([x respondsToSelector:@selector(boolValue)] && 
    [x isKindOfClass:objc_getClass("__NSCFNumber")]) 
    [self doSomethingThatExpectsABool:[x boolValue]]; 

其他每一招...... 失敗。買家當心,這不是萬無一失的(__NSCFNumber可能是平臺/機器特定 - 它是完全是蘋果的實現細節)......但正如他們所說的...... 沒有其他工作!