3

在我的代码中,我使用这个测试来检查用户是否在pickerView中选择了一些东西:

if ( !selection || [selection isEqualToString:@"Select..."] ) {}

但是,Stack Overflow 上的许多帖子都建议使用NSNull以下示例或类似以下示例的测试:

if ( selection.length == 0 || [selection isEqualToString:@"(null)"] ) {}

上面的代码行还有许多变体,所有测试我只是使用的 null :!selection

我的测试是否不完整并且容易出现错误?!selection和这些其他测试有什么区别?

4

3 回答 3

2
selection.length == 0

如果您想将零长度字符串和 nil 视为同一事物,这是很好的,这通常是这种情况。因为向 nil 对象发送消息是安全的,并且结果将为 nil、0 或 0.0,所以您可以安全地执行此操作。

您只需要使用 isEqualToString: 就可以将其他可能的字符串视为与 nil 等效的字符串,例如 @"(null)",我看到在某种对象图中转换文本数据时会发生这种情况,我有时在 JSON 中看到这一点,其中生成 JSON 的代码无法正确处理 null。

NSNull 是一个对象,如果你可以得到一个 NSNull 的实例来代替 nil,你可能也必须对此进行测试,很多 JSON 解析器都会发生这种情况。它也是一种将 nil 存储在集合对象(NSArray 和 NSDictionarys)中的方法

于 2012-09-11T00:20:26.223 回答
1

我能预见的唯一错误是本地化错误。如果您在某处使用 设置选择器数据,却忘记根据当前本地化NSLocalizedString()正确检查,该怎么办?@"Select..."那会很烦人,尤其是如果您的测试人员没有彻底测试所有本地化...

但是,!selection两者selection.length == 0都应该没问题,即使选择是nil,并且nil.length没有意义......所以,我会说:

if ( !selection || [selection isEqualToString:@"(null)"] ) {}
于 2012-09-10T23:47:30.747 回答
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)
于 2012-09-10T23:48:01.873 回答