我们在Objective-C 时代,通常使用 - isEqualToString: 来在已经能确定比较对象和待比较对象都是NSString 的时候进行字符串判等。Swift 中的String 类型中是没有- isEqualToString: 或者 - isEqual: 这样的方法的,因为这些毕竟是NSObject 的东西。Swift 的字符串内容判等,我们简单的使用== 操作符来进行:

let str1 = "快乐的字符串"
let str2 = "快乐的字符串"
let str3 = "开心的字符串"str1 == str2 // true
str1 == str3 // false

在判等上Swift 的行为和Objective-C 有着巨大的差别。在Objective-C 中== 这个符号的意思是判断两个对象是否指向同一块内存地址。其实很多时候这并不是我们所期望的判等,我们更关心的往往还是对象的内容相同,而这种意义上的相等即使两个对象引用的不是同一块内存的地址时,也可以做到的。在Objective-C 中我们通常通过 - isEqusl: 进行重写,或者更进一步去实现类似 - isEqualToString: 这样的 - isEqualToClass: 的带有类型信息的方法来进行内容判断。如果我们没有在任意子类重写 - isEqual: 的话,在调用这个方法时会直接使用NSObject 中的版本,去直接进行Objective-C 的== 判断。

在Swift 中情况大不一样,Swift 里的== 是一个操作符的声明,在Equatable 里声明了这个操作符的接口方法:

public protocol Equatable {/// Returns a Boolean value indicating whether two values are equal.////// Equality is the inverse of inequality. For any values `a` and `b`,/// `a == b` implies that `a != b` is `false`.////// - Parameters:///   - lhs: A value to compare.///   - rhs: Another value to compare.static func == (lhs: Self, rhs: Self) -> Bool
}

实现这个接口的类型需要定义适合自己类型的== 操作符,如果我们认为两个输入有相等关系的话,就应该返回true。实现了Equatable 的类型就可以使用 ==!= 操作符来进行相等判定了(在实现时我们只需要实现==!= 则由标准库自动取反实现)。这和原来Objective-CisEqual: 的行为十分相似,比如我们在一个待办事项应用中,从数据库中取得使用uuid 进行编号的待办条件,在实践中我们一般考虑使用这个uuid 来判定两个条目对象是不是同一条目。让这个表示条目的TodoItem 类实现Equatable 接口:

class TodoItem {let uuid: Stringvar title: Stringinit(uuid: String, title: String) {self.uuid = uuidself.title = title}
}extension TodoItem: Equatable {}func ==(lhs: TodoItem, rhs: TodoItem) -> Bool {return lhs.uuid == rhs.uuid
}

对于== 的实现我们并没有像实现其他一些接口一样将其放在对应的extension 里,而是放在了全局的scope 中。这是合理的做法,因为你应该需要在全局范围内都能使用==。事实上,Swift 的操作符都是全局的,关于操作符的更多信息,可以参看操作符。

Swift 的基本类型重载了自己对应版本的==,而对于NSObject 的子类来说,如果我们使用==并且没有对于这个子类的重载的话,将转为调用这个类的 - isEqual: 方法。这样如果这个NSObject 子类原来就实现了 - isEqual: 的话,直接使用== 并不会造成它的Swift 类型的行为差异;但是如果无法找到合适的重写的话,这个方法就将回滚使用最初的NSObject 里的实现,对引用对象地址进行直接比较。因为对于NSObject 子类的判等你有两种选择:要么重载==,要么重写 -isEqual:。如果你只是在Swift 中使用的话,两种方式是等效的,但是如果你还需要在Objective-C 中使用这个类的话,因为Objective-C 不接受操作符重载,只能使用 - isEqual: 这时你应该考虑使用第二种方式。

对于原来Objective-C 中使用== 进行的对象指针的判定,在Swift 中提供的是另一个操作符===。在Swift 中=== 只有一种重载:

@inlinable public func === (lhs: AnyObject?, rhs: AnyObject?) -> Bool

它用来判断两个AnyObject 是否是同一个引用。

let string: NSString = "aaaa"
let name: NSString = "aaa"
if string === name {print("相同地址")
}

对于判等,和它紧密相关的一个话题就是哈希,因为哈希是一个稍微复杂的话题,所以我将它单独写成一篇。但是如果在实际项目中你需要重载== 或者重写 - isEqual: 来进行判等的话,很可能你也会想看看有关哈希的内容,重载了判等的话,我们还需要提供一个可靠的哈希算法,使得判等的对象在字典中作为key 是不会发生奇怪的事情。

Swift - 判等相关推荐

  1. Swift - 判端网络连接状态,连接类型(3G还是Wifi)

    IJReachability是一个使用Swift写的第三方网络检测类.可以测试网络是否连接,并支持3G和Wifi的检测. 使用样例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ...

  2. swift代码转oc代码_什么是不安全的Swift代码?

    swift代码转oc代码 崩溃应用是安全的方法 (Crashing your app is the safe route) 强制展开可选的安全代码! (Force-Unwrapping An Opti ...

  3. Swift 5.0 值得关注的特性:增加 ResultT, E: Error 枚举类型

    背景 在异步获取数据的场景中,常见的回调的数据结构是这样的:表示获取成功的数据,表示获取失败的 error.因为数据可能获取成功,也可能失败.因此回调中的数据和错误都是 optional 类型. 比如 ...

  4. 初探swift语言的学习笔记一(基本数据类型)

    作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/28258805 转载请注明出处 如果觉得文章对你有所帮助,请通过留言 ...

  5. Queue(队列)-Swift实现与广度优先搜索应用

    定义 仅可以在队首进行删除,队尾进行插入的线性表,称为队列. 特点 先入队列,则先删除(First In First Out),类似Stack 应用 键盘的输入输出 广度优先搜索等算法的实现 Swif ...

  6. ios 可以为空声明_iOS开发中使用OC和swift的对比(2)

    OC与swift 1.协议 OC:主要用来传值 swift:不仅可以用来传值,swift中的协议可以定义属性方法,并且其协议可以进行扩展,在扩展中还可以有自己的默认实现,这个特性使其可以面向协议的时候 ...

  7. swift 字符串转int_Swift Tips Streamline 如何假装写过 Swift

    作者 Nemocdz,腾讯 iOS 工程师.这篇文章转载至他的博客,可以点击阅读原文来查看他的博客.本文总结了笔者日常使用 Swift 的一些小 Tips. 文章较长,预计阅读时间 15分钟 Safe ...

  8. 窥探Swift之新添数据类型元组与可选值

    今天的博客中就总结一下关于Swift中相对Objc新添加的两个数据类型:元组(Tuple)和可选值类型(Optional).上面这两个类型是Swift独有的类型,使用起来也是非常方便的,今天就通过一些 ...

  9. Swift基础——数组Array

    Swift基础--数组Array 数组:使用有序列表存储同一类型的多个值,相同值可出现在一个数组的不同位置. 数组简介 首先,和String一样我们也来看看他的一些Api方法 常规操作方法 rever ...

最新文章

  1. 精彩碰撞!神经网络和传统滤波竟有这火花?
  2. Project Explore 再现
  3. 使用 Contour 接管 Kubernetes 的南北流量
  4. css实现图片自适应容器的几种方式
  5. Redis的常用命令——hash的常用命令
  6. js根据毫米/厘米算像素px
  7. 5.4 Components -- Wrapping Content in A Component(在组件中包裹内容)
  8. 使用Photoshop制作名片
  9. 数据安全-整体解决方案
  10. 解决Ubuntu下载缓慢问题
  11. oracle重要文件的位置
  12. 【Latex学习】Latex中插入超链接/网址
  13. cluster-proportional-autoscaler源码分析及如何解决KubeDNS性能瓶颈
  14. 记一个印象深刻的项目
  15. node.js学习笔记Day2
  16. 为什么从此电脑访问不了ftp_巧用FTP来管理手机文件 从此摆脱USB
  17. Open Infrastructure丹佛峰会:所有的华丽终将回归质朴
  18. STM32CUBEMX(2)--USART通过DMA方式接收不定长数据
  19. 从外部的js文件中获取ASPX页面的控件ClientID(get control reference from external javascript)...
  20. ubuntu 字体设置像Windows 字体

热门文章

  1. Android 各种时间格式转换
  2. 阿里云短信api发送异常
  3. 【数据结构】初识时间空间复杂度
  4. PHP Fatal error: Class 'Illuminate\Foundation\Console\Kernel' not found in D:\phpstudy\PHPTutorial
  5. MySQL 架构与内部模块
  6. NLP数据预处理的一般方法
  7. ARM处理器指令集(精简指令集)
  8. python 处理Bus Hound 数据
  9. React 环境搭建以及创建项目工程(二)
  10. 软连接文件的创建删除