Objective C: 相等性 == 和严格相等性 ===

3
作为一名Javascript程序员,我被灌输了使用===而不是==的习惯。但是,在学习Objective C时,即使在官方文档中,我只看到使用==
我的问题是,我是否应该继续在我的Objective C代码中使用严格相等的习惯?它是否像在Javascript中一样必要?我认为严格相等可以略微提高性能,但在Objective C中,这种提升是否太微小以至于没有太大的差别呢?

请查看以下链接:https://dev59.com/YHE95IYBdhLWcg3wft1w 和 https://dev59.com/jFzUa4cB1Zd3GeqP7-5U - DharaParekh
1
你在Javascript中使用===的原因只是因为它的==运算符已经破损到无法使用。在Objective-C中,==运算符并没有破损,但对于对象来说,它几乎肯定不会做你想要的事情。下面的两个答案解释了为什么以及你应该怎么做。 - JeremyP
4个回答

9

很简单,在Objective C中,你没有===运算符。

通常你不会使用==来比较对象,因为它只比较指针值,而不是对象的值。所以,如果你想比较两个字符串,你应该使用:

[stringObject isEqual:@"the string"];

这里比较的是字符串的值,而不是指针。然而,有些情况下使用==运算符比较对象是合理的。许多委托回调函数的参数中都包含发送者对象。例如,如果您正在使用一个控制器实现多个表视图,您可能需要检查哪个表视图正在调用您的方法:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
  if (tableView == self.firstTableView) {
     ...
  }

   if (tableView == self.secondTableView) {
     ...
  }
...
}

2

JS中存在严格相等运算符(===),因为常规相等运算符(==)会在比较两种不同的数据类型时进行隐式类型转换。其中一个参数将根据一组晦涩难懂的规则转换为与另一个参数匹配的类型。例如,1 == TRUE将给出'true',即使1是数字而TRUE是布尔值。有人知道Objective-C是否像这样进行隐式类型转换吗?


它不会。在C语言中,==表示严格相等,在Objective-C中也是如此。 - Alexander

1
据我所知,在Objective-C中没有===的等价物。
您可以使用==比较int和float,但出于其他原因,这并不是一个好主意。当您使用==比较两个ids(例如UIView*和UIButton*)时,您比较的是指针值。如果TRUE/YES,则它是相同的对象,甚至不仅仅是相等的。它是相同的实例。
当比较对象的值是否相等时,最好使用isEqual:方法。您可能需要在自己的子类中重写isEqual才能正确地使用它与自己的对象一起使用。
如果您有一些具体的问题/示例,那么我们可以更好地解释它。

1

Objective C 中没有像 === 这样的运算符。

如果您想比较两个对象,基本上有一个通用规则:使用 isEqual: 而不是使用 == 来比较对象。除非您非常确定自己在做什么。

这里有一个非常好的链接,可以深入了解:ObjectComparison


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接