Iphone 如何结合“int”和“NSInteger”的优点`

Iphone 如何结合“int”和“NSInteger”的优点`,iphone,objective-c,ios,nsnumber,Iphone,Objective C,Ios,Nsnumber,一个看似简单的问题:我可以有某种数字对象,可以是nil,但可以像原语int一样赋值: 像这样: NSNumber *n = nil; n = 3; if(n == nil){ // some actions... } else if (n == 1){ // some actions... } else { // some actions... } 感谢您的输入答案是否定的。如果变量是一个对象,您可以指定另一个对象 n = anotherNSNumbe

一个看似简单的问题:我可以有某种数字对象,可以是nil,但可以像原语int一样赋值:

像这样:

NSNumber *n = nil; 
n = 3; 

if(n == nil){ 
    // some actions... 
} else if (n == 1){ 
    // some actions... 
} else { 
    // some actions... 
}

感谢您的输入

答案是否定的。如果变量是一个对象,您可以指定另一个对象

n = anotherNSNumber;
或者,使用属性或方法设置值

然后,将该对象与另一个对象进行比较

if (n == anotherNSNumber) // Checks the reference
或者使用属性/方法比较其值


不,你不能。原因是
nil
是指向地址
0x0
的指针,即
nil==0
。因此,您将无法在
0
nil
之间消除歧义

更不用说它们也应该是不同类型的
nil
用作指针,而像0或3这样的数字是标量

nil
定义为

#define nil NULL
NULL
的典型定义如下:

#define NULL ((void *)0)

不是你想的那样。没有

当你说:

NSNumber *n = nil;
您要说的是声明一个指向NSNumber对象的指针,但现在让它指向nil这没关系;因为您以后可能要做的是获取指向NSNumber对象的指针,然后将其分配给此变量,以便
n
是一个无效NSNumber对象的指针

下一行:

n = 3;

您没有给对象赋值,而是说
n
指向地址3。它不是地址,也不包含对象。

其他人提到的简短回答是“否”。
但以下对代码的轻微修改将获得类似的结果:

NSNumber *nObject = [NSNumber numberWithInt:3]; 
int n = nObject.intValue; // Zero if nObject is nil

if(nObject == nil){ 
    // some actions... 
} else if (n == 1){ 
    // some actions... 
} else { 
    // some actions... 
}

NSInteger与NSNumber不同。NSNumber是一个类,而NSInteger是一个类型定义。为什么不使用NSInteger或int?使用基本int可能是最简单的解决方案,但我喜欢这样一个事实,即对象可以是“空”的,因此是nil,这在int中显然是不可能的。如果nObject为nil,您确定n为0吗?我宁愿猜测它仍然未初始化,可以有任何值。当nObject为nil时,n的值实际上为零。这是因为发送到nil对象的消息将始终返回nil,并且nil是地址零<代码>NSNumber*nObject=nil;int n=nObject.intValue;NSLog(@“n的值为%d”,n)将输出“n的值为0”
n = 3;
NSNumber *nObject = [NSNumber numberWithInt:3]; 
int n = nObject.intValue; // Zero if nObject is nil

if(nObject == nil){ 
    // some actions... 
} else if (n == 1){ 
    // some actions... 
} else { 
    // some actions... 
}