我在网上找到的大多数示例都这样写:
if(x != nil)
// ...
这有什么问题吗?
if(x)
// ...
我在一个简单的程序中都尝试过,但没有发现任何区别。
Answers:
在Objective-C中,nil
被定义为一个名为的值__DARWIN_NULL
,该值本质上等于0
或等于false
if语句。因此,写作
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语句。有一点要注意。
someCondition
值为布尔值,但这是一个重要的警告。
nil
基本上等于0,因此这些条件求和到if (0)
和if (0 != 0)
,这两个都是错误的。
两者相同,这是一个样式问题,归结为您是否喜欢:
如果(某物){...}
与
我总是发现#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;
}
并检查
NSString *strUuid = [Common trimWhiteSpaceAndNewLine:[dict valueForKeyPath:@"detail.uuid"]];
if (![strUuid isEqualToString:@""]) {
// do your stuff
}
if(someCondition==true)
,不鼓励这样做,因为在C派生的语言中,原则上可以将除0以外的任何值视为布尔值true,但是由于历史原因,如果someCondition
is-1
和true
is定义为1
then则得出someCondition==true
false。