设置为nil和0的变量之间的差异

时间:2010-06-17 04:06:08

标签: objective-c null

if (myFloat == nil){
    \\Do Method
}

在上述情况下,仅当myFloatnil时,该方法才会运行。如果myFloat设置为0,它还会运行吗?

3 个答案:

答案 0 :(得分:2)

nil只能与指针一起使用。它表示指针尚未设置为值。

Floats和其他C类型只有一个值。 (严格浮动和加倍可能有像NaN这样的值,但这更难管理)

在Objective C中,您可以在类NSNumber中包装一个浮点数。该类的对象由指针引用,因此NSNumber *类型的变量可以为nil。

答案 1 :(得分:0)

嗯,nil在技术上是0.但是,其中一些取决于myFloat的变量类型。如果myFloat是一个C float,你不能依赖于它正好是0.你真的应该在id类型上使用nil。

答案 2 :(得分:0)

在我开始回答之前,请参阅 this table from NSHipster 以重新了解类空符号系列的含义:

<头>
符号 价值 含义
NULL (void *)0 C 指针的文字空值
nil (id)0 Obj-C 对象的文字空值
Nil (Class)0 Obj-C 类的文字空值
NSNull [NSNull null] 用于表示空值的单个对象

如上面的值列所示,除 NSNull 之外的所有值均以 0 作为其基础值。

我运行了一些与零检查和零检查相关的测试用例。

关键:

  • ✅ 条件满足,所以打印日志
  • ❌条件不满足,所以没有打印日志
NSNumber* nilNSNumber = nil;
if(nilNSNumber == nil){
    NSLog(@"nilNSNumber == nil"); // ✅
}
if(nilNSNumber == 0){
    NSLog(@"nilNSNumber == 0"); // ✅
}

NSNumber* zeroNSNumberA = 0;
if(zeroNSNumberA == nil){
    NSLog(@"zeroNSNumberA == nil"); // ✅
}

NSNumber* zeroNSNumberB = [[NSNumber alloc] initWithInt:0];
if(zeroNSNumberB == nil){
    NSLog(@"zeroNSNumberB == nil"); // ❌
}
if(zeroNSNumberB == 0){
    NSLog(@"zeroNSNumberB == 0"); // ❌
}

NSObject* objectUninitialised = [NSObject alloc];
if(objectUninitialised == nil){
    NSLog(@"objectUninitialised == nil"); // ❌
}
if(objectUninitialised == 0){
    NSLog(@"objectUninitialised == 0"); // ❌
}

NSObject* objectInitialised = [objectUninitialised init];
if(objectInitialised == nil){
    NSLog(@"objectInitialised == nil"); // ❌
}
if(objectUninitialised == 0){
    NSLog(@"objectInitialised == 0"); // ❌
}

if([NSNull null] == 0){
    NSLog(@"NSNull == 0"); // ❌
}
if([NSNull null] == nil){
    NSLog(@"NSNull == nil"); // ❌
}