最后更新: 2017-07-23

在程序开发中,我们时常需要来判断两个对象是否相等。在编程思想中,两个对象相等指的是在内存中的地址相同,也就是两个指针指向同一个地址。但是在日常理解中,只要两个对象的内容相同即表示想等,怎么处理这类问题才是此文所需要阐述的。

在iOS开发中,无论是OC还是Swift都有一定的方式来处理此问题,因此我们将从两种语言的角度来阐述.


Objective-C

在OC中,任何对象都继承与NSObject,NSObject定义了如下方法来比较两个对象是否相同,

- (BOOL)isEqual:(id)object;

从官方解释中,我们可以获取到如下信息

  1. 如果两个对象相同,那么两个对象的 Hash值一定相同,反之
  2. 如果你想重写 isEqual:,同时你也要去重写 hash

    详细内容可以去参考:
  3. Equality
  4. NSObject subclass in Swift: hash vs hashValue, isEqual vs ==

例子:

建立一个OC的工程,然后创建一个 Student,因为学生的学号是唯一,因此我们创建一个sNo属性表示学号, name表示名称,就这么简单就可以了。(实际情况可能很复杂,但是思想基本不变话)

为了简单方便,我们做如下代码

Student *s1 = [[Student alloc] initWithNo:@"10" name:@"zhangsan"];
Student *s2 = [[Student alloc] initWithNo:@"10" name:@"zhangsan"];
BOOL isEqual = [s1 isEqual:s2]; // false

isEqual比较两个对象的所指向的内存地址,明显不一致,因此为 false

因为同一个学号只能表示同一个人,因此,我们可以重写 Student中的isEqual方法

- (BOOL)isEqual:(Student *)object
{
if (!object) {
return NO;
} if (![object isKindOfClass:[Student class]]) {
return NO;
} return [[self identifier] isEqualToString:[object identifier]];
} - (NSUInteger)hash
{
return [self identifier].hash;
} // 抽离出来,更好扩展
- (NSString *)identifier
{
return self.sNo;
}

注意一点: 如果两个对象相同,那么他们的hash一定相同.

但是: hash相同,对象不一定相同, 可Google 散列冲突


Swift

Swift中存在 Class(类)Struct(结构体), 如果一个类继承 NSObject,我们可以采用上面OC重写 isEqualHash 的方式。但Swift是一门面向协议编程的语言,Swift也能够重载操作符,因此,我们可以采用更加便捷的方式来处理。

多说一句, Xcode提供playground对我们而言,简直就是神兵利器.

Class

  1. 重写 isEqual & Hash

    // Override Hash and isEqual
    class Student : NSObject {
    var sID : String init(sID : String) {
    self.sID = sID
    } override func isEqual(_ object: Any?) -> Bool {
    guard let obj = object as? Student else { return false}
    return self.identifier.hashValue == obj.identifier.hashValue
    } override var hash: Int {
    return self.identifier.hashValue
    } var identifier : String {
    return self.sID
    }
    }
  2. 重写 ==

参考资料:

Swift equality的更多相关文章

  1. [Swift]LeetCode990. 等式方程的可满足性 | Satisfiability of Equality Equations

    Given an array equations of strings that represent relationships between variables, each string equa ...

  2. swift学习笔记1——基础部分

    之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...

  3. Swift 自动布局框架-SnapKit

    官方网址:http://snapkit.io/ Github: https://github.com/SnapKit/SnapKit SnapKit is a DSL to make Auto Lay ...

  4. Swift Explore - 关于 Swift 中的 isEqual 的一点探索

    在我们进行 App 开发的时候,经常会用到的一个操作就是判断两个对象是否相等.比如两个字符串是否相等.而所谓的 相等 有着两层含义.一个是值相等,还有一个是引用相等.如果熟悉 Objective-C ...

  5. Swift LeetCode 目录 | Catalog

    请点击页面左上角 -> Fork me on Github 或直接访问本项目Github地址:LeetCode Solution by Swift    说明:题目中含有$符号则为付费题目. 如 ...

  6. Swift中关于集合计算的几种函数记录(intersect、symmetricDifference、union、subtract)

    很久之前用过一次,后来就忘了...扎心,现在记录一下 PS:这几种函数其实不限于swift内的,在JavaScript.python.DB等其他语言,应该也有类似用法,这里我只简单讲了在swift内的 ...

  7. swift的Hashable

    Conforming to the Hashable Protocol To use your own custom type in a set or as the key type of a dic ...

  8. Realm Swift

    Realm Swift 当前这个翻译,主要是方便我自己查阅api,有非常多地方写的比較晦涩或者没有翻译,敬请谅解 version 0.98.7 官方文档 參考文献 Realm支持类型 String,N ...

  9. 17条 Swift 最佳实践规范

    本文由CocoaChina译者小袋子(博客)翻译自schwa的github主页原文作者:schwa 这是一篇 Swift 软件开发的最佳实践教程. 前言 这篇文章是我根据在 SwiftGraphics ...

随机推荐

  1. CentOS7 安装SQLCMD

    1. Study From https://docs.microsoft.com/zh-cn/sql/linux/sql-server-linux-setup-tools?view=sql-serve ...

  2. 解决MySql忘记密码

    描述:忘记了mysql的登录密码,无法登录的情况下该怎么办? 环境:CentOS 7,数据库:mysql 5.7 1.停止数据库(先查看mysql服务是否运行) # ps -ef | -i grep ...

  3. arm链接脚本

    一. 为什么需要链接脚本 1.1. 从源码到可执行程序(主要有三个步骤:预编译.编译.链接) 1.1.1. 预编译 a. 预编译器执行.譬如C中的宏定义就是由预编译器处理,注释等也是由预编译器处理的. ...

  4. python中虚拟环境virtualenvwrapper的安装和使用

    虚拟环境为什么需要虚拟环境:       到目前为止,我们所有的第三方包安装都是直接通过 pip install xx 的方式进行安装的,这样安装会将那个包安装到你的系统级的 Python 环境中.但 ...

  5. 分布式事务解决方案汇总:2PC、3PC、消息中间件、TCC、状态机+重试+幂等(转)

    数据一致性问题非常多样,下面举一些常见例子.比如在更新数据的时候,先更新了数据库,后更新了缓存,一旦缓存更新失败,此时数据库和缓存数据会不一致.反过来,如果先更新缓存,再更新数据库,一旦缓存更新成功, ...

  6. vue项目1-pizza点餐系统6-路由精讲之复用router-view

    1.在主组件展示二级路由的组件内容,在App.vue中添加 <br> <div class="container"> <!-- row 行排列 --& ...

  7. HTTP1.0、HTTP 1.1、HTTP 2.0之间的主要区别

    HTTP1.0与HTTP 1.1的主要区别  长连接 节约带宽 HOST域 HTTP1.1与HTTP 2.0的主要区别  多路复用 二进制分帧 首部压缩 服务器推送 一.HTTP1.0与HTTP 1. ...

  8. socket 服务器向指定的客户端发消息

    一.需求 需求如题. 当多个客户端连接服务器时,服务器如何给指定的客户端发送消息. 二.解决方案 核心思想: 在服务器端,需保存不同客户端的socket列表及客户端相关信息. socket含有发送方和 ...

  9. Thinkphp5 手册

    thinkphp5 手册 https://www.kancloud.cn/manual/thinkphp5/118003

  10. 如何算gama(1/2)=sqrt(pi)?

    关键是算e^{-x^2}在0到oo的定积分是sqrt(pi)/2. 或者利用高斯密度函数来求解