Swift - 判等
我们在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-C
的isEqual:
的行为十分相似,比如我们在一个待办事项应用中,从数据库中取得使用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 - 判等相关推荐
- Swift - 判端网络连接状态,连接类型(3G还是Wifi)
IJReachability是一个使用Swift写的第三方网络检测类.可以测试网络是否连接,并支持3G和Wifi的检测. 使用样例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ...
- swift代码转oc代码_什么是不安全的Swift代码?
swift代码转oc代码 崩溃应用是安全的方法 (Crashing your app is the safe route) 强制展开可选的安全代码! (Force-Unwrapping An Opti ...
- Swift 5.0 值得关注的特性:增加 ResultT, E: Error 枚举类型
背景 在异步获取数据的场景中,常见的回调的数据结构是这样的:表示获取成功的数据,表示获取失败的 error.因为数据可能获取成功,也可能失败.因此回调中的数据和错误都是 optional 类型. 比如 ...
- 初探swift语言的学习笔记一(基本数据类型)
作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/28258805 转载请注明出处 如果觉得文章对你有所帮助,请通过留言 ...
- Queue(队列)-Swift实现与广度优先搜索应用
定义 仅可以在队首进行删除,队尾进行插入的线性表,称为队列. 特点 先入队列,则先删除(First In First Out),类似Stack 应用 键盘的输入输出 广度优先搜索等算法的实现 Swif ...
- ios 可以为空声明_iOS开发中使用OC和swift的对比(2)
OC与swift 1.协议 OC:主要用来传值 swift:不仅可以用来传值,swift中的协议可以定义属性方法,并且其协议可以进行扩展,在扩展中还可以有自己的默认实现,这个特性使其可以面向协议的时候 ...
- swift 字符串转int_Swift Tips Streamline 如何假装写过 Swift
作者 Nemocdz,腾讯 iOS 工程师.这篇文章转载至他的博客,可以点击阅读原文来查看他的博客.本文总结了笔者日常使用 Swift 的一些小 Tips. 文章较长,预计阅读时间 15分钟 Safe ...
- 窥探Swift之新添数据类型元组与可选值
今天的博客中就总结一下关于Swift中相对Objc新添加的两个数据类型:元组(Tuple)和可选值类型(Optional).上面这两个类型是Swift独有的类型,使用起来也是非常方便的,今天就通过一些 ...
- Swift基础——数组Array
Swift基础--数组Array 数组:使用有序列表存储同一类型的多个值,相同值可出现在一个数组的不同位置. 数组简介 首先,和String一样我们也来看看他的一些Api方法 常规操作方法 rever ...
最新文章
- 精彩碰撞!神经网络和传统滤波竟有这火花?
- Project Explore 再现
- 使用 Contour 接管 Kubernetes 的南北流量
- css实现图片自适应容器的几种方式
- Redis的常用命令——hash的常用命令
- js根据毫米/厘米算像素px
- 5.4 Components -- Wrapping Content in A Component(在组件中包裹内容)
- 使用Photoshop制作名片
- 数据安全-整体解决方案
- 解决Ubuntu下载缓慢问题
- oracle重要文件的位置
- 【Latex学习】Latex中插入超链接/网址
- cluster-proportional-autoscaler源码分析及如何解决KubeDNS性能瓶颈
- 记一个印象深刻的项目
- node.js学习笔记Day2
- 为什么从此电脑访问不了ftp_巧用FTP来管理手机文件 从此摆脱USB
- Open Infrastructure丹佛峰会:所有的华丽终将回归质朴
- STM32CUBEMX(2)--USART通过DMA方式接收不定长数据
- 从外部的js文件中获取ASPX页面的控件ClientID(get control reference from external javascript)...
- ubuntu 字体设置像Windows 字体