在Objective-C中测试零——如果(x!=零)与如果(x)
我在网上找到的大多数例子都是这样写的:在Objective-C中测试零——如果(x!=零)与如果(x),objective-c,syntax,Objective C,Syntax,我在网上找到的大多数例子都是这样写的: if(x != nil) // ... 这有什么问题吗 if(x) // ... 在Objective-C中,nil被定义为一个名为\uu DARWIN\u NULL的值,它在if语句中的计算结果本质上是0或false。因此,写作 if(x==nil)与写入if(!x)相同,写入if(x!=nil)等于if(x)(因为与false比较会产生一个否定,而与true比较会保持相同的条件) 您可以用任何一种方式编写代码,这实际上取决于您认为
if(x != nil)
// ...
这有什么问题吗
if(x)
// ...
在Objective-C中,
nil
被定义为一个名为\uu DARWIN\u NULL
的值,它在if语句中的计算结果本质上是0
或false
。因此,写作
if(x==nil)
与写入if(!x)
相同,写入if(x!=nil)
等于if(x)
(因为与false
比较会产生一个否定,而与true
比较会保持相同的条件)
您可以用任何一种方式编写代码,这实际上取决于您认为哪一种更具可读性。我觉得if(x)更有意义,但这取决于你的风格 这就像比较
if(someCondition==true)
和if(someCondition)
这完全取决于你,以及谁来阅读代码
编辑:正如Yuji正确提到的那样,由于Objective-C是C的超集,任何计算结果为0以外的值的条件都被认为是真的,因此,如果上面示例中的
someCondition
计算结果为整数值,例如,-1,将其与true
进行比较将导致false
,并且不会计算if语句。需要注意的事情。两者
if (x != nil)
及
是等效的,因此选择您认为使您的代码对您(以及将阅读和支持您的代码的其他人)更具可读性的变体。两者都是相同的,这是一个风格问题,它归结为您是否喜欢:
我总是发现#1更清晰,但#2在文档和字段中被广泛使用,因此最好同时了解这两种形式并适应项目使用的内容,并且在风格上保持一致。检查nil的最佳安全方法是
创建一个通用方法,并添加所有这些null:
+ (NSString *)trimWhiteSpaceAndNewLine:(NSString *)string {
NSString *stringSource = [NSString stringWithFormat:@"%@",string];
if ([stringSource isEqualToString:@"(null)"]) {
stringSource = @"";
return stringSource;
}
if ([stringSource isEqualToString:@"<null>"]) {
stringSource = @"";
return stringSource;
}
if ([stringSource isEqualToString:@"<nil>"]) {
stringSource = @"";
return stringSource;
}
if ([stringSource isKindOfClass:[NSNull class]]) {
stringSource = @"";
return stringSource;
}
if ([stringSource isEqualToString:@""]) {
stringSource = @"";
return stringSource;
}
if (stringSource == nil) {
stringSource = @"";
return stringSource;
}
NSString *stringFinal = [stringSource stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
return stringFinal;
}
如果(someCondition==true)不被鼓励,我应该加上
,因为在C派生语言中,0以外的任何值原则上都可以被视为布尔真值,但是由于历史原因,如果someCondition
是-1
并且true
被定义为1
,那么someCondition==true
的计算结果为false。@Yuji,这是正确的。不过,我试图暗示,someCondition
的计算结果为布尔值,但这是一个重要的警告。正如他们所说,这两种形式都很好。但是,请注意,如果您试图将Obj-C引用转换为BOOL,则会出现一些微妙和危险的问题,如so if x==0中所述;如果(x)和(x!=nil)表现相同,他们会这样做吗?@erik是的,他们会nil
本质上等于0,因此这些条件在(0)
和(0!=0)的情况下计算为if(0)
,两者都为false。
+ (NSString *)trimWhiteSpaceAndNewLine:(NSString *)string {
NSString *stringSource = [NSString stringWithFormat:@"%@",string];
if ([stringSource isEqualToString:@"(null)"]) {
stringSource = @"";
return stringSource;
}
if ([stringSource isEqualToString:@"<null>"]) {
stringSource = @"";
return stringSource;
}
if ([stringSource isEqualToString:@"<nil>"]) {
stringSource = @"";
return stringSource;
}
if ([stringSource isKindOfClass:[NSNull class]]) {
stringSource = @"";
return stringSource;
}
if ([stringSource isEqualToString:@""]) {
stringSource = @"";
return stringSource;
}
if (stringSource == nil) {
stringSource = @"";
return stringSource;
}
NSString *stringFinal = [stringSource stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
return stringFinal;
}
NSString *strUuid = [Common trimWhiteSpaceAndNewLine:[dict valueForKeyPath:@"detail.uuid"]];
if (![strUuid isEqualToString:@""]) {
// do your stuff
}