Swift equality
最后更新: 2017-07-23
在程序开发中,我们时常需要来判断两个对象是否相等。在编程思想中,两个对象相等指的是在内存中的地址相同,也就是两个指针指向同一个地址。但是在日常理解中,只要两个对象的内容相同即表示想等,怎么处理这类问题才是此文所需要阐述的。
在iOS开发中,无论是OC还是Swift都有一定的方式来处理此问题,因此我们将从两种语言的角度来阐述.
Objective-C
在OC中,任何对象都继承与NSObject
,NSObject定义了如下方法来比较两个对象是否相同,
- (BOOL)isEqual:(id)object;
从官方解释中,我们可以获取到如下信息
- 如果两个对象相同,那么两个对象的
Hash
值一定相同,反之- 如果你想重写
isEqual:
,同时你也要去重写hash
详细内容可以去参考:- Equality
- 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重写 isEqual
与 Hash
的方式。但Swift是一门面向协议编程的语言,Swift也能够重载操作符
,因此,我们可以采用更加便捷的方式来处理。
多说一句, Xcode提供playground
对我们而言,简直就是神兵利器.
Class
重写
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
}
}
重写
==
参考资料:
Swift equality的更多相关文章
- [Swift]LeetCode990. 等式方程的可满足性 | Satisfiability of Equality Equations
Given an array equations of strings that represent relationships between variables, each string equa ...
- swift学习笔记1——基础部分
之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...
- Swift 自动布局框架-SnapKit
官方网址:http://snapkit.io/ Github: https://github.com/SnapKit/SnapKit SnapKit is a DSL to make Auto Lay ...
- Swift Explore - 关于 Swift 中的 isEqual 的一点探索
在我们进行 App 开发的时候,经常会用到的一个操作就是判断两个对象是否相等.比如两个字符串是否相等.而所谓的 相等 有着两层含义.一个是值相等,还有一个是引用相等.如果熟悉 Objective-C ...
- Swift LeetCode 目录 | Catalog
请点击页面左上角 -> Fork me on Github 或直接访问本项目Github地址:LeetCode Solution by Swift 说明:题目中含有$符号则为付费题目. 如 ...
- Swift中关于集合计算的几种函数记录(intersect、symmetricDifference、union、subtract)
很久之前用过一次,后来就忘了...扎心,现在记录一下 PS:这几种函数其实不限于swift内的,在JavaScript.python.DB等其他语言,应该也有类似用法,这里我只简单讲了在swift内的 ...
- swift的Hashable
Conforming to the Hashable Protocol To use your own custom type in a set or as the key type of a dic ...
- Realm Swift
Realm Swift 当前这个翻译,主要是方便我自己查阅api,有非常多地方写的比較晦涩或者没有翻译,敬请谅解 version 0.98.7 官方文档 參考文献 Realm支持类型 String,N ...
- 17条 Swift 最佳实践规范
本文由CocoaChina译者小袋子(博客)翻译自schwa的github主页原文作者:schwa 这是一篇 Swift 软件开发的最佳实践教程. 前言 这篇文章是我根据在 SwiftGraphics ...
随机推荐
- go io库
1 io.Reader和io.Writer的获取 tcp协议下的io.Reader是从conn中获取到的,因为要先建立conn,conn建立成功之后,然后读写数据. 2 真正的读写 2.1 io.Co ...
- Spring中的常见注解
@Controller 标识一个该类是Spring MVC controller处理器,用来创建处理http请求的对象. @RestController Spring4之后加入的注解,原来在@Co ...
- Android使用adb抓完整Log
前言 最新项目里一直在做 Android RIL 方面的研究,非常最终项目还是未能解决通信底层模块的问题,但是在使用adb抓log上还是有一些收获的,这里记录一下. Log分类 A ...
- JS案例经验1
一 可以通过设置在一个div中的多个div的定位属性为absolute,从而使得这几个元素重叠.他们都脱离了标准流. 二 对于absolute的left和right属性,当left和right同时出现 ...
- 【系统】win10锁屏后,护眼绿自动恢复解决
针对自己电脑(其他人的不晓得),win10锁屏后,重新登录,护眼绿会自动恢复成白色,查询资料需要修改注册表两个地方: 1.计算机\HKEY_CURRENT_USER\Control Panel\Col ...
- object in javascript
枚举对象属性 for....in 列举obj的可枚举属性,包括自身和原型链上的 object.keys() 只列举对象本身的可枚举属性 创建对象的几种方式 对象字面量 const pre='test' ...
- vuex介绍和vuex数据传输流程
1.什么是vuex? 公共状态管理:解决多个非父子组件传值麻烦的问题:简单说就是多个页面都能用Vuex中store公共的数据 a.并不是所有的数据都要放在Vuex中,只有各个组件公用的一些数据会放在V ...
- mysql复习(1)基本CRUD操作
一.这段时间在学校,把之前的东西都好好捡起来. 0.下面介绍Mysql的最基本的增删改查操作,很多IT工作者都必须掌握的命令,也是IT面试最常考的知识点.在进行增删改查之前,先建立一个包含数据表use ...
- C#/Java 调用WSDL接口及方法
一.C#利用vs里面自带的“添加web引用”功能: 1.首先需要清楚WSDL的引用地址 如:http://www.webxml.com.cn/Webservices/WeatherWebServic ...
- xcode自动生成代码片段
一.什么是代码片段 当在Xcode中输入dowhile并回车后,Xcode会出现下图所示的提示代码: 这就是代码片段,目的是使程序员以最快的速度输入常用的代码片段,提高编程效率.该功能是从Xcode4 ...