以下是返回错误,因为显然我无法将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];
}
}
答案 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
。