if (myFloat == nil){
\\Do Method
}
在上述情况下,仅当myFloat
为nil
时,该方法才会运行。如果myFloat
设置为0
,它还会运行吗?
答案 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"); // ❌
}