2010-01-21 58 views
57

好吧,我有點困惑。 這可能只是一個小事。Objective-C字典插入BOOL

我有一個函數,它看起來是這樣的:

- (void)getNumbersForNews:(BOOL)news andMails:(BOOL)mails { 
NSMutableDictionary *parameters = [[NSMutableDictionary alloc] init]; 
[parameters setValue:news forKey:@"getNews"]; 
[parameters setValue:mails forKey:@"getMails"];...} 

不要緊,我是否使用setValue:forKey:setObject:ForKey:,我總是得到一個警告:

「傳遞參數1的設置...使整數指針沒有投射「...

如何在地球上插入bool到dictiona RY?

回答

116

NSDictionary中的值必須是對象。爲了解決這個問題,包裝在NSNumber對象的布爾值:

[parameters setValue:[NSNumber numberWithBool:news] forKey:@"news"]; 
[parameters setValue:[NSNumber numberWithBool:mails] forKey:@"mails"]; 
+10

別忘了,用Clang v3.1進行測試,我們可以使用文字:'NSNumber * yesNumber = @ YES';相當於'[NSNumber numberWithBool:YES]' – coco 2013-05-10 23:03:55

+9

因此,正如@coco所說的,您可以使用'@ YES'和'@ NO'來代替'[NSNumber numberWithBool:YES]'和'[NSNumber numberWithBool:NO]'分別。正如@AlBlue指出的那樣,稍後從字典中檢索值的方法是使用'[[myDictionary objectForKey:theKey] boolValue]'。 – RoberRM 2013-09-06 00:25:30

+0

否否否您正在使用setValue,它不是NSMutableDictionary方法,而是KVO方法。改用setObject。 – 2016-05-23 19:11:15

14

Objective-C容器只能存儲Objective-C對象,因此您需要將BOOL包裝在某個對象中。您可以使用[NSNumber numberWithBool]創建一個NSNumber對象並存儲結果。
稍後,您可以使用NSNumber的-boolValue返回布爾值。

6

您可以插入@"YES"@"NO"字符串對象,Cocoa會將其讀回到布爾。

否則,我會建議使用工廠方法創建字典,如dictionaryWithObjectsAndKeys:

+0

這聽起來很危險的 - 如果你想字符串什麼? – quantumpotato 2011-11-01 19:57:06

+0

我可能弄錯了,但使用boolValue和stringValue會產生所需的結果。需要一個布爾值?使用boolValue。需要一個字符串?用stringValue去。 – Eimantas 2011-11-02 06:35:55

+0

@Eimantas我絕對喜歡你的方式...;-) – 2012-03-23 12:31:33

8

BOOL不是一個對象 - 它是int的同義詞,它的值爲0或1。因此,它不會被放在一個包含對象的結構中。

您可以使用NSNumber爲任何整數類型創建對象包裝;有一個構造函數[NSNumber numberWithBool:],您可以調用它來獲取對象,然後使用它。同樣,您可以使用它重新獲取對象:[obj boolValue]

2

看到@Steve哈里森的答案我有一個評論。出於某種原因,這不適用於傳遞對象屬性,例如,

[parameters setValue:[NSNumber numberWithBool:myObject.hasNews] forKey:@"news"]; 

此項設定參數NSDictionarynews鍵爲空(因爲某些原因不能真正理解爲什麼)

我唯一的解決辦法是使用@ Eimantas的方式如下:

[parameters setValue:[NSNumber numberWithBool:myObject.hasNews ? @"YES" : @"NO"] forKey:@"news"]; 

這工作完美無瑕。不要問我爲什麼直接通過BOOL不起作用,但至少我找到了解決方案。有任何想法嗎?

7

參考現代代碼:

parameters[@"getNews"] = @(news);