【问题标题】:Difference between an variable set to nil and 0设置为 nil 和 0 的变量之间的差异
【发布时间】:2010-06-17 04:06:07
【问题描述】:
if (myFloat == nil){
    \\Do Method
}

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

【问题讨论】:

  • myFloat 是实际的float 类型吗?如果是这样,您不应该将其设置/比较为nil,这仅对对象引用有效。这是一个苹果与橘子的比较,尽管在这种特定情况下它可能会起作用,因为在编译代码时,nil 和 0 本质上是相同的。
  • float 等类型是否有 nil 等价物?
  • @GP Burdell:不,没有,因为float 不是指针类型。好吧,实际上,我想您可以将 NaN 用于浮点值。 steve.hollasch.net/cgindex/coding/ieeefloat.html

标签: objective-c null


【解决方案1】:

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

浮点数和其他 C 类型只有一个值。 (严格来说,浮点数和双精度数可能会有像 NaN 这样的值,但这更难管理)

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

【讨论】:

【解决方案2】:

嗯,从技术上讲,nil 是 0。但是,这其中一些取决于 myFloat 是什么类型的变量。如果 myFloat 是 C 浮点数,则不能完全依赖于 0。您确实应该在 id 类型上使用 nil。

【讨论】:

  • 但是对于像 float 这样的原始类型我应该使用什么?
  • 这取决于你在做什么。如果您有一个指向浮点数的指针,则可以与 0 进行比较。但是,您应该查看浮点数在计算机中的表示方式。
【解决方案3】:

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

Symbol Value Meaning
NULL (void *)0 literal null value for C pointers
nil (id)0 literal null value for Obj-C objects
Nil (Class)0 literal null value for Obj-C classes
NSNull [NSNull null] singleton object used to represent 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"); // ❌
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-25
    • 1970-01-01
    • 2017-10-13
    • 2021-07-04
    • 1970-01-01
    • 2015-05-03
    • 1970-01-01
    相关资源
    最近更新 更多