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

后端 未结 5 1392
清酒与你
清酒与你 2020-12-29 01:15

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

相关标签:
5条回答
  • 2020-12-29 02:01

    It wants an actual object... use NSNull

    [NSNull null];
    
    0 讨论(0)
  • 2020-12-29 02:01

    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.

    0 讨论(0)
  • 2020-12-29 02:06

    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 
    
    0 讨论(0)
  • 2020-12-29 02:11

    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"];
    
    0 讨论(0)
  • 2020-12-29 02:13

    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.

    0 讨论(0)
提交回复
热议问题