EquaTable的使用

2021-02-19  本文已影响0人  孙国立

官方文档

先上一下官方文档地址。如果想更深入的去学习和了解的话可以直接访问下面的链接:
官方文档

具体的使用

关于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就派上用场了。

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
其他的一些方法可以自己去查看文档找寻一下。
然后简单的来说一下这个方法是干嘛的吧。就是返回判断的结果的。lhsrhs就是我们做判断的时候左边和右边的参数。而这个方法返回的判断结果是你想要对哪些自定义类中的属性判断的结果的总结果。比方说我只想判断numberstreet的结果是否都相同,呢就不需要添加unit属性的判断结果了。
现在会出现另一个问题如果当前这个类中引入了另一个自定义的类的时候要怎么进行判断呢。

  1. 多个类
    这个类还是使用上面的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
    }
}

然后实现StreeAddressEquatable协议

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这个自定义类不具备直接判断的方法。因此我们需要继续实现DemoEquatable协议

extension Demo : Equatable{
    static func == (lhs: Demo, rhs: Demo) -> Bool {
        return lhs.name == rhs.name
    }
}

到这里我们就可以很愉快的对自定义的类进行==判断了。
继承自Equatable的一些protocol大家可以自行查看官方文档了解一下

上一篇 下一篇

猜你喜欢

热点阅读