检查NSInteger是否为零的语法?

时间:2015-09-03 21:24:03

标签: objective-c

以下是返回错误,因为显然我无法将NSInteger或int与nil进行比较。任何人都可以建议语法来做到这一点

array[0] = (int)(Math.random() * 500 + 1);
      ^---note 0 index
largest = array[0];
smallest = array[0];

for(i = 1; ...) {
        ^--start at index #1
   array[i] = (int)(Math.random() * 500 + 1);
   if (array[i] < smallest) {
     smallest = array[i];
   }
   if (array[i] > largest) {
     largest = array[i];
  }
}

6 个答案:

答案 0 :(得分:3)

NSInteger是基本类型,而不是对象。我非常确定NSInteger * 不是你想要的东西,而是一个NSInteger。 integerForKey返回NSInteger,而不是NSInteger *。

答案 1 :(得分:3)

NSInteger lastID = [[NSUserDefaults standardUserDefaults] integerForKey:@"lastID"] == 0 ? 1 : [[NSUserDefaults standardUserDefaults] integerForKey:@"lastID"];

NSInteger是一种原始类型。零是用于对象。 0检查,检查是您的userDefaults指定值的整数值。如果未分配,则返回0.

答案 2 :(得分:3)

NSInteger是一个原语,而不是NSObject,因此与nil的任何假设比较都可以有效地与数字零进行比较。

由于您使用三元运算符将lastID分配给装箱的NSNumber @1,如果结果为nil,那么您想要做的就是存储NSNumber默认值,使用objectForKey:检索它,并在检索到的NSNumber上使用integerValue来获取原始值。

如果你确实想要存储基元,那很好,但是你需要将你的逻辑改为不期望nil,这基本上只与NSObject的子库有关。

更新:示例应用。

#import <Foundation/Foundation.h>

enum {
    MyIdTypeUnrecognized = 0,
    MyIdTypeInvalid      = 1
} myIdType;

int main(int argc, char *argv[]) {
    @autoreleasepool {

        NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
        NSString *key = @"lastID";
        NSInteger lastID = -100;

        [defaults removeObjectForKey:key];

        NSLog(@"Case 1: should find 0, and set lastID to 1.");
        lastID = [defaults integerForKey:key];
        lastID = (lastID == MyIdTypeUnrecognized) ? MyIdTypeInvalid : lastID;
        NSLog(@"--- lastID:%ld", lastID);

        NSLog(@"Case 2: Set lastID to 2, then try to fetch.");
        lastID = -100;
        [defaults setInteger:2 forKey:key];
        [defaults synchronize];
        lastID = [defaults integerForKey:key];
        lastID = (lastID == MyIdTypeUnrecognized) ? MyIdTypeInvalid : lastID;
        NSLog(@"--- lastID:%ld", lastID);
    }
}
//2015-09-04 10:04:38.075 nsnotfound[66983:5231434] Case 1: should find 0, and set lastID to 1.
//2015-09-04 10:04:38.076 nsnotfound[66983:5231434] --- lastID:1
//2015-09-04 10:04:38.076 nsnotfound[66983:5231434] Case 2: Set lastID to 2, then try to fetch.
//2015-09-04 10:04:38.076 nsnotfound[66983:5231434] --- lastID:2

我之前建议您使用NSNumber,因为您的问题使用的是NSNumber - @1@1只是[NSNumber numberWithInteger:1]的简写。如果你不想使用对象,你绝对可以使用原语。

上面的示例使用零和一个作为“无效”和“无效”ID的标记值。应用程序逻辑应该可以使用所有其他ID。我希望这会有所帮助。

答案 3 :(得分:0)

您可以将此号码检索到NSNumber这是一个对象,这样您就可以检查它是否为零。

答案 4 :(得分:0)

NSInteger基本上是32位的Int或32位长的类型转换,因为你比较int类似于你可以比较NSInteger.It永远不会是零。

答案 5 :(得分:0)

NSInteger不是一个对象,它是一个基本类型,存储为NSNumber NSUserDefaults。检查原始类型是否存在有点棘手,因为它的不存在等价于nil或0.如果它不存在则获取其值并获得默认值的最简洁方法可能就是这样:

NSNumber *lastID = [[NSUserDefaults standardUserDefaults] objectForKey:@"lastID"] ?: @1;

如果存在,则会返回lastID,否则会得到值为1的NSNumber