在我的代码中,我使用此测试来检查用户是否在pickerView中选择了某些内容:
if ( !selection || [selection isEqualToString:@"Select..."] ) {}
但是,Stack Overflow上的很多帖子建议使用NSNull
或类似下面的示例测试:
if ( selection.length == 0 || [selection isEqualToString:@"(null)"] ) {}
上面的代码行中还有许多变体都在测试我正在使用的null:!selection
我的测试是否不完整,是否容易陷入错误?
!selection
和其他测试之间有什么区别?
答案 0 :(得分:2)
selection.length == 0
如果你想将零长度字符串和nil视为同一个东西,这是很好的,通常就是这种情况。因为将消息发送到nil对象是安全的,结果将是nil,0或0.0,所以你可以安全地执行此操作。
你只需要使用isEqualToString:你有其他可能的字符串要等同于nil,例如@“(null)”,我看到在某种Object图中转换文本数据时会发生这种情况,我有时会在JSON中看到这一点,其中生成JSON的代码无法正确处理null。
NSNull是一个对象,你可能必须测试它,如果你可能得到NSNull的实例代替nil,这会发生在很多JSON解析器中。它也是一种在集合对象(NSArray和NSDictionarys)中存储nil的方法
答案 1 :(得分:1)
我唯一可以预见的错误是本地化错误。如果您使用NSLocalizedString()
在某处设置选取器数据,并忘记根据当前的本地化正确检查@"Select..."
,该怎么办?这将非常烦人,特别是如果您的测试人员没有彻底测试所有本地化......
但是,!selection
和selection.length == 0
都应该都可以,即使选择nil
,nil.length
也没有意义......所以,我请说:
if ( !selection || [selection isEqualToString:@"(null)"] ) {}
答案 2 :(得分:1)
首先,您需要了解nil,NSNull和NULL之间的区别。
nil
- (id)0表示未初始化的id
个对象,但由于逻辑不能在某些模式中使用,例如您无法将nil值添加到数组中。
NSNull
- 用于初始化nil
表示的单例类 - 您可以将其添加到数组中。
NULL
- (void *)0,表示任何未初始化的对象,它必须在那里用于向后C
支持
对于初始化检查,我通常使用宏(obj != nil) && (obj != (id)[NSNull null])
对于空字符串检查,您可以使用
((obj != nil) && (obj != (id)[NSNull null]) && obj.length > 0 && [obj containsOnlyWhitespaceOrNewline] == NO)