官方文档
先上一下官方文档地址。如果想更深入的去学习和了解的话可以直接访问下面的链接:
官方文档
具体的使用
关于EquaTable
的具体使用我就不参照官方呢么正式的说法去说了,我会按照我的理解去说一下EquaTable
的一些日常开发中的使用。
-
EquaTable
是干嘛用的
通过单词的含义我们就可以很好的知道它是用来做比较
和包含判断
的。类似于下面的情况
// **比较操作**
let name1 = "xiaoming"
let name2 = "xiaohong"
if name1 == name2
print("相同")
else
print("不同")
//**判断操作**
let nameArray = ["xiaoming", "xiaohong", "zhangsan", "lisi"]
let checkName = "hahaha"
if nameArray.contains(checkName)
print("存在")
else
print("不存在")
类似于数组
、字典
等等都默认的具有上面代码中的这些判断
功能,而我们自定义
的Class
类却不具备这种判断的功能。如果想要我们自定义的Class
类同样的具有这些功能呢EquaTable
就派上用场了。
-
EquaTable
在自定义类中的具体使用方法- 单个类
自定义类
我定义了一个StreeAddress
类。类的定义内容如下
- 单个类
class StreeAddress{
let number : String
let street : String
let unit : String?
init(_ number : String , _ street : String , _ unit : String? = nil) {
self.number = number
self.street = street
self.unit = unit
}
}
此时我们使用上面的这个类创建实例对象的话是没法直接使用==
来进行判断和比较的。
给StreeAddress
类实现Equatable的protocol协议
extension StreeAddress : Equatable{
static func == (lhs: StreeAddress, rhs: StreeAddress) -> Bool {
return
lhs.number == rhs.number &&
lhs.street == rhs.street &&
lhs.unit == rhs.unit &&
}
}
static func == (lhs: Self, rhs: Self) -> Bool
这个方法是我们必须要去实现的一个协议,还有一个协议我们也有可能会用到,就是下面这个协议
public static func != (lhs: Self, rhs: Self) -> Bool
。
其他的一些方法可以自己去查看文档找寻一下。
然后简单的来说一下这个方法是干嘛的吧。就是返回判断的结果的。lhs
和rhs
就是我们做判断的时候左边和右边的参数。而这个方法返回的判断结果是你想要对哪些自定义类
中的属性判断的结果的总结果
。比方说我只想判断number
和street
的结果是否都相同,呢就不需要添加unit
属性的判断结果了。
现在会出现另一个问题
如果当前这个类中引入了另一个自定义的类的时候要怎么进行判断呢。
- 多个类
这个类还是使用上面的StreeAddress
类进行一些相关的操作
class StreeAddress{
let number : String
let street : String
let unit : String?
let demo : Demo
init(_ number : String , _ street : String , _ name : String, _ unit : String? = nil) {
self.number = number
self.street = street
self.unit = unit
self.demo = Demo(name)
}
}
class Demo{
let name : String
init(_ name : String = "名字") {
self.name = name
}
}
然后实现StreeAddress
的Equatable
协议
extension StreeAddress : Equatable{
static func == (lhs: StreeAddress, rhs: StreeAddress) -> Bool {
return
lhs.number == rhs.number &&
lhs.street == rhs.street &&
lhs.unit == rhs.unit &&
lhs.demo == rhs.demo
}
}
这个时候会发现lhs.demo == rhs.demo
这行代码报错,报错的原因是因为Demo
这个自定义类不具备直接判断的
方法。因此我们需要继续实现Demo
的Equatable
协议
extension Demo : Equatable{
static func == (lhs: Demo, rhs: Demo) -> Bool {
return lhs.name == rhs.name
}
}
到这里我们就可以很愉快的对自定义的类
进行==
判断了。
继承自Equatable
的一些protocol
大家可以自行查看官方文档了解一下