Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

iOS: Why can't I set nil to NSDictionary value?

This might be very basic question but I was wondering why can't I assign nil as NSDictionary value? I have following statement many places in my code. If [q objectForKey:@"text"] is nil then App is crashing.

NSMutableDictionary *dict = [[NSMutableDictionary alloc] initWithCapacity:2]; [dict setObject:[q objectForKey:@"text"] forKey:@"text"]; 

I have to check everywhere for the nil before assigning it to dictionary. Is this the only correct way of doing? Am I missing something obvious?

if([q objectForKey:@"text"] != nil)     [dict setObject:[q objectForKey:@"text"] forKey:@"text"]; else     [dict setObject:@"" forKey:@"text"]; 
like image 752
AlienMonkeyCoder Avatar asked Aug 17 '12 15:08

AlienMonkeyCoder


2 Answers

It wants an actual object... use NSNull

[NSNull null]; 
like image 103
tybro0103 Avatar answered Sep 20 '22 20:09

tybro0103


You can set a nil value using setValue:forKey but it removes the key.

If you want to be able to set a key to nil you could use setValue:forKey: which will remove the key if you set it to nil (quote from documentation below). Note the Value instead of Object.

setValue:forKey:

Adds a given key-value pair to the dictionary.

... 
Discussion

This method adds value and key to the dictionary using setObject:forKey:, unless value is nil in which case the method instead attempts to remove key using removeObjectForKey:.

When you later try and get the object using objectForKey: for the key that you removed by setting it to nil you will get nil back (quote from documentation below).

Return value:

The value associated with aKey, or nil if no value is associated with aKey.

Note: The key will not actually be present in the dictionary so it won't be obtained using allKeys; or be enumerated over.

like image 33
David Rönnqvist Avatar answered Sep 17 '22 20:09

David Rönnqvist