2010-01-21 15 views
57

ठीक है, मैं थोड़ा उलझन में हूं। शायद यह सिर्फ एक छोटी सी है।उद्देश्य-सी शब्दकोश एक बूल

मैं एक समारोह जो कुछ इस तरह दिखता है:

- (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 को पास करना ... बिना किसी कलाकार के पूर्णांक से पॉइंटर बनाता है "...

पृथ्वी पर मैं एक डिक्शनरी में एक बूल कैसे डालूं ry?

उत्तर

116

NSDictionary में मान वस्तुओं होना चाहिए। इस समस्या को हल करने के लिए, NSNumber वस्तुओं में बूलियन्स लपेट:

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

और क्लैंग v3.1 के साथ tarting को मत भूलना, हम अक्षर का उपयोग कर सकते हैं: 'NSNumber * yesNumber = @ YES'; '[NSNumber numberWithBool: YES]' – coco

+9

के बराबर, तो, जैसा कि @ कोको कहते हैं, आप '[YES'and '@ NO' का उपयोग' [NSNumber numberWithBool: YES]' और '[NSNumber numberWithBool: NO] 'के विकल्प के रूप में कर सकते हैं। क्रमशः। और जैसा कि @AlBlue नीचे बताया गया है, बाद में शब्दकोश से मूल्य पुनर्प्राप्त करने का तरीका '[[myDictionary objectForKey: theKey] boolValue]' का उपयोग करना होगा। – RoberRM

+0

नहीं, नहीं, आप सेटवैल्यू का उपयोग कर रहे हैं, जो एक एनएसएमयूटेबल डिक्शनरी विधि नहीं है, बल्कि एक केवीओ विधि है। इसके बजाय setObject का प्रयोग करें। –

14

उद्देश्य-सी कंटेनर केवल उद्देश्य-सी ऑब्जेक्ट्स स्टोर कर सकते हैं ताकि आपको किसी ऑब्जेक्ट में आपको BOOL को लपेटने की आवश्यकता हो। आप [NSNumber numberWithBool] के साथ एक NSNumber ऑब्जेक्ट बना सकते हैं और परिणाम संग्रहित कर सकते हैं।
बाद में आप NSNumber के -boolValue का उपयोग करके अपने बूलियन मूल्य को वापस प्राप्त कर सकते हैं।

6

आप @"YES" या @"NO" स्ट्रिंग ऑब्जेक्ट्स डाल सकते हैं और कोको इसे वापस पढ़ने के बाद इसे ऊन पर डाल देगा।

अन्यथा मैं dictionaryWithObjectsAndKeys: जैसे फैक्टरी विधि का उपयोग करके शब्दकोश बनाने का सुझाव दूंगा।

+0

कि खतरनाक लग रहा है - क्या हुआ अगर आप स्ट्रिंग चाहते थे? – quantumpotato

+0

मुझे गलत हो सकता है, लेकिन boolValue और stringValue का उपयोग करने से आवश्यक परिणाम मिलेंगे। एक बुलियन की आवश्यकता है? BoolValue का प्रयोग करें। एक स्ट्रिंग की आवश्यकता है? StringValue के साथ जाओ। – Eimantas

+0

@Eimantas मैं निश्चित रूप से अपना रास्ता पसंद करता हूं ...;-) –

8

एक बूल एक वस्तु नहीं है - यह एक int के पर्याय का है और इसके मूल्य के रूप में 0 या 1 है। नतीजतन, यह एक वस्तु-युक्त संरचना में नहीं रखा जा रहा है।

आप किसी भी पूर्णांक प्रकार के लिए ऑब्जेक्ट रैपर बनाने के लिए NSNumber का उपयोग कर सकते हैं; एक निर्माता [NSNumber numberWithBool:] है जिसे आप ऑब्जेक्ट प्राप्त करने के लिए आमंत्रित कर सकते हैं, और उसके बाद इसका उपयोग कर सकते हैं। इसी तरह, आप ऑब्जेक्ट को फिर से प्राप्त करने के लिए इसका उपयोग कर सकते हैं: [obj boolValue]

2

@Steve हैरिसन का जवाब देखकर मैं एक टिप्पणी है। किसी कारण से यह गुजरने वाले ऑब्जेक्ट गुणों के साथ काम नहीं करता है जैसे उदा।

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

यह news पैरामीटर NSDictionary में अशक्त करने के लिए महत्वपूर्ण सेट (किसी कारण से वास्तव में समझ में नहीं आता क्यों)

मेरे एकमात्र समाधान का उपयोग करने के @ Eimantas के रास्ते इस प्रकार थी:

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

यह बेकार ढंग से काम किया। मुझसे मत पूछें कि क्यों BOOL गुजर रहा है सीधे काम नहीं करता है लेकिन कम से कम मुझे एक समाधान मिला है। कोई विचार?

7

संदर्भ के लिए आधुनिक कोड:

parameters[@"getNews"] = @(news); 
संबंधित मुद्दे