代码之家  ›  专栏  ›  技术社区  ›  testing

检查NSNumber是否为空

  •  18
  • testing  · 技术社区  · 14 年前

    如何检查NSNumber对象是零还是空?

    OK nil很简单:

    NSNumber *myNumber;
    if (myNumber == nil)
        doSomething
    

    但是,如果对象已经创建,但是由于赋值失败而没有值,我如何检查它?用这样的东西?

    if ([myNumber intValue]==0)
       doSomething
    

    是否有一个通用的方法来测试空对象,比如NSString(参见下面的 post

    例1

    NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
    [dict setValue:@"" forKey:@"emptyValue"];
    NSNumber *emptyNumber = [dict objectForKey:@"emptyValue"];
    

    哪个值 emptyNumber 是空的吗?

    例2

    NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
    [dict setValue:@"" forKey:@"emptyValue"];
    NSString *myString = [dict objectForKey:@"emptyValue"];
    if (myString == nil || [myString length] == 0)
        // got an empty value
        NSNumber *emptyNumber=nil;
    

    如果我以后用这个怎么办 设置为零?

    [emptyNumber intValue]
    

    我得到零吗?

    NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
    [dict setValue:@"" forKey:@"emptyValue"];
    NSNumber *myEmptyValue = [dict objectForKey:@"emptyValue"];
    if (myEmptyValue == nil)
        // NSLog is never called
        NSLog(@"It is empty!");
    

    这样就不会调用NSLog。 myEmptyValue 不是 nil NSNull

    5 回复  |  直到 14 年前
        1
  •  12
  •   Georg Fritzsche    14 年前

    NSValue , NSNumber , ... 应该是从一个价值中创造出来的,并且总是持有一个价值。测试特定值,如 0

    “无效” “未设置” nil NSNull

    在你的

    [dict setValue:[NSNull null] forKey:@"emptyValue"];
    
    if ([dict objectForKey:@"emptyValue"] == [NSNull null]) {
        // ...
    }
    

    但请注意,除非需要区分,否则不能简单地插入(或删除)该值 (也就是说,不在容器中)和, “无效”

    if ([dict objectForKey:@"nonExistent"] == nil) {
        // ...
    }
    

    至于 , -intValue 给你 -但仅仅是因为向 退货 0 . 你也可以得到 e、 g.对于一个 谁的 intValue 已设置为 之前,可能是有效值。
    正如我已经在上面写的,你只能这样做,如果 不是您的有效值 为你 ,什么最有效完全取决于您的需求。

    总结

    选项1:

    0 -1 -intValue公司 / ... 具体代表 “空” . 你显然不是这样。

    选项2:

    :

    // add if not empty:
    [dict setObject:someNumber forKey:someKey];    
    // remove if empty:
    [dict removeObjectForKey:someKey];
    // retrieve number:
    NSNumber *num = [dict objectForKey:someKey];
    if (num == nil) {
        // ... wasn't in dictionary, which represents empty
    } else {
        // ... not empty
    }
    

    但是,这意味着空键和从不存在或非法的键之间没有区别。

    选项3:

    在一些罕见的情况下,将所有键保存在字典中并表示 “空” 具有不同的值。如果你不能使用数字范围中的一个,我们必须在 不知道 “空” . 可可已经有了 对于此类情况:

    // set to number if not empty:
    [dict setObject:someNumber forKey:someKey];
    // set to NSNull if empty:
    [dict setObject:[NSNull null] forKey:someKey];
    // retrieve number:
    id obj = [dict objectForKey:someKey];
    if (obj == [NSNumber null]) {
        // ... empty
    } else { 
        // ... not empty
        NSNumber *num = obj;
        // ...
    }
    

    此选项现在允许您区分 “空” , “不为空” “不在容器中”

        2
  •  3
  •   zoul    14 年前

    NSNumber 或者 nil

    NSMutableDictionary *hash = [NSMutableDictionary dictionary];
    [hash setObject:@"" forKey:@"key"];
    NSNumber *number = [hash objectForKey:@"key"];
    NSLog(@"%i", [number intValue]);
    

    这个 NSLog 将打印 0 intValue 中的方法 NSString 数字对象

    NSLog(@"%i", [number unsignedIntValue]);
    

    这将抛出:

    -[NSCFString unsignedIntValue]: unrecognized selector sent to instance 0x303c
    

    也就是说你是 从散列中得到一些一般的空值,就可以得到 NSString字符串 你储存在那里。

    == nil ) 数字对象 发送一条信息,结果为零。这只是一种简化代码的语言约定:

     (array != nil && [array count] == 0)
     (someNumber == nil ? 0 : [someNumber intValue])
    

    会变成这样:

     ([array count] == 0)
     ([someNumber intValue])
    

    希望这有帮助。

        3
  •  1
  •   B. Wolf    9 年前

    处理Swift 2.0和解析:

    var myNumber = yourArray!.objectForKey("yourColumnTitle")
        if (myNumber == nil) {
        myNumber = 0
          }
    

    就我而言,我必须:

        let myNumberIntValue = myNumber!.intValue
    
        4
  •  0
  •   zem    14 年前

    NSNumber

        5
  •  0
  •   badweasel    12 年前

    从字典中取出一个对象是很常见的(至少对我来说是这样),期望它是一个NSNumber,然后让它返回一个nil对象。如果发生这种情况,并且执行intValue,它将崩溃。

    我所做的是设置nil保护,因为我宁愿得到一个默认值而不是崩溃。

    一种方法是:

    -(int) intForDictionary:(NSDictionary *)thisDict objectForKey: (NSString *)thisKey withDefault: (int)defaultValue
    {
        NSNumber *thisNumber = [thisDict objectForKey:thisKey];
        if (thisNumber == nil) {
            return defaultValue;
        }
        return [thisNumber intValue];
    }
    

    我有一个类似的花车。那么你至少可以得到你的默认值。另一种方法是创建一个零保护的方法。。

    -(NSNumber *)nilProtectionForNumber: (NSNumber *)thisNumber withDefault: (NSNumber *)defaultNumber
    {
        if (thisNumber) {
            return thisNumber;
        }
        else
            return defaultNumber;
    }
    

    你会这样称呼他:

    NSNumber *value = [self nilProtectionForNumber:[dict objectForKey:keyThatShouldBeNSNumber] withDefault:[NSNumber numberWithInt:0]];