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 objectFor
It wants an actual object... use NSNull
[NSNull null];
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 isnil
in which case the method instead attempts to remove key usingremoveObjectForKey:
.
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.
My friend using nil as marker is a sign of bad programming . nil is reserved for some diffrent purpose .
if([q objectForKey:@"text"] != nil) [dict setObject:[q objectForKey:@"text"] forKey:@"text"]; else [dict removeObjectforKey:@"text"]; // this will do nothing if key does not exsist.
//by default for all the keys the value is nil and you are trying to override this behavior. going against the language rules will always get you in trouble .
to check just use
if([dict objectforKey:@"text"] !=nil){} // this will work becuase default value is nil itself
You can set nil object in this way:
NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];
dictionary[@“key”] = nil;
Have you noticed it?
NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];
/* this statement is safe to execute */
dictionary[@“key”] = nil;
/* but this statement will crash application */
[dictionary setObject:nil forKey:@"key"];
When using this method:
func setObject(_ anObject: Any, forKey aKey: NSCopying)
Parameters (according to Apple doc's):
anObject:
Raises an invalidArgumentException if anObject is nil. If you need to represent a nil value in the dictionary, use NSNull .
aKey
Raises an invalidArgumentException if aKey is nil.