swift中的!=
2016-08-09 本文已影响34人
gogo_coder
我们知道在swift如果定义的struct model需要实现Equatable
协议中的==
操作符,一个最简单的例子:
![](https://img.haomeiwen.com/i969941/7f8c2a04745194f7.png)
那么如果是Class呢?
![](https://img.haomeiwen.com/i969941/b61213e06fd108f5.png)
貌似也没问题。如果这个类继承自NSObject
呢?
![](https://img.haomeiwen.com/i969941/453c5cac06021323.png)
好了,第一个问题出现了,这个很简单,因为NSObject已经遵循了Equatable
协议,所以编译器会提示多余操作,直接删除这行。
![](https://img.haomeiwen.com/i969941/42722959b7186118.png)
应该就可。。。
![](https://img.haomeiwen.com/i969941/948e5fb6fa0f8744.png)
WTF,a != b
竟然也是true?
不是已经指明了只要lhs.name == rhs.name
就算相等了吗?
难道编译器没有为我们实现!=操作符,而直接使用了父类的!=操作符?我们来添加一个!=验证一下。
![](https://img.haomeiwen.com/i969941/e3cf0956e89a96f5.png)
终于对了,看来在子类中没有实现!=操作符会直接使用父类的,此处的父类为NSObject,而它的取等运算使用的是hash值,那么两个对象!=会返回true。
![](https://img.haomeiwen.com/i969941/36ed83bab9fa1c23.png)