【问题标题】:Objective-C: If an object belongs to a class, does this mean the object isn't nil or null as well?Objective-C:如果一个对象属于一个类,这是否意味着该对象也不是 nil 或 null ?
【发布时间】:2017-05-06 15:25:28
【问题描述】:

下面的代码是我之前在我的应用程序中使用的代码。

之前:

  if ([dic objectForKey:@"text"] isKindOfClass:[NSString class]] && [dic objectForKey:@"text"] != nil && [dic objectForKey:@"text"] != [NSNull Null]) {
       NSString *text = [dic objectForKey:@"text"];
    }

我已将代码更改为以下代码。

之后:

    if ([dic objectForKey:@"text"] isKindOfClass:[NSString class]]) {
        NSString *text = [dic objectForKey:@"text"];
    }

我相信结果应该是一样的,但后者更整洁。为了安全起见,我提出这个问题是为了确保我对此是正确的,并且没有忽略任何事情。

【问题讨论】:

  • 我会这样写:id obj = dic[@"text"]; if ([objc isKindOfClass: [NSString class]]) {etc}。但在针对类集群进行测试时请注意:stackoverflow.com/questions/1096772/…
  • 那个类集群警告很有趣,但在这里真的不适用。此外,该问题的两个最佳答案严重误解了苹果的观点。苹果只是建议,如果你有一些接口规定一个对象将是一种类型,你应该遵守该合同,然后你不应该在幕后测试它是否真的是集群的另一个类型并尝试利用它。在这种情况下,没有这样的合同。
  • 对了,你可以使用dic[@"text"]

标签: objective-c null


【解决方案1】:

您的更简单的代码将起作用。

如果[dic objectForKey:@"text"]nil,那么对isKindOfClass 的调用甚至不会被调用,实际上会返回false 的结果。

如果[dic objectForKey:@"text"] 不是nil,那么它必须是NSString 才能成为true,因此无需检查它是否是NSNull

换句话说,如果[[dic objectForKey:@"text"] isKindOfClass:[NSString class]]true,那么您已经知道它不是nil,并且您已经知道它不是NSNull,因此不需要这些检查。

【讨论】:

  • 感谢您为我确认这一点。我也是这么想的。
猜你喜欢
  • 2017-12-19
  • 2010-09-18
  • 2011-02-05
  • 1970-01-01
  • 1970-01-01
  • 2010-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多