Objective-C dictionary inserting a BOOL

Objective CDictionaryBoolean

Objective C Problem Overview


OK, I'm a little confused. It's probably just a triviality.

I've got a function which looks something like this:

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

It doesn't matter whether I use setValue:forKey: or setObject:ForKey:, I'm always getting a warning:

> "Passing argument 1 of set... makes pointer from integer without a cast"...

How on earth do I insert a bool into a dictionary?

Objective C Solutions


Solution 1 - Objective C

Values in an NSDictionary must be objects. To solve this problem, wrap the booleans in NSNumber objects:

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

Solution 2 - Objective C

Objective-C containers can store only Objective-C objects so you need to wrap you BOOL in some object. You can create a NSNumber object with [NSNumber numberWithBool] and store the result.
Later you can get your boolean value back using NSNumber's -boolValue.

Solution 3 - Objective C

Modern code for reference:

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

Solution 4 - Objective C

A BOOL is not an object - it's a synonym for an int and has 0 or 1 as its values. As a result, it's not going to be put in an object-containing structure.

You can use NSNumber to create an object wrapper for any of the integer types; there's a constructor [NSNumber numberWithBool:] that you can invoke to get an object, and then use that. Similarly, you can use that to get the object back again: [obj boolValue].

Solution 5 - Objective C

You can insert @"YES" or @"NO" string objects and Cocoa will cast it to bool once you read them back.

Otherwise I'd suggest creating dictionary using factory method like dictionaryWithObjectsAndKeys:.

Solution 6 - Objective C

Seeing @Steve Harrison's answer I do have one comment. For some reason this doesn't work with passing object properties like for e.g.

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

This sets the news key to null in the parameter NSDictionary (for some reason can't really understand why)

My only solution was to use @Eimantas's way as follows:

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

This worked flawlessly. Don't ask me why passing the BOOL directly doesn't work but at least I found a solution. Any ideas?

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionInfiniteView Question on Stackoverflow
Solution 1 - Objective CSteve HarrisonView Answer on Stackoverflow
Solution 2 - Objective CVladimirView Answer on Stackoverflow
Solution 3 - Objective CHatchmaster JView Answer on Stackoverflow
Solution 4 - Objective CAlBlueView Answer on Stackoverflow
Solution 5 - Objective CEimantasView Answer on Stackoverflow
Solution 6 - Objective CLukasView Answer on Stackoverflow