post Image
Equatableとは?(swift) ~ object同士を比較できるようにしよう〜

1. Equatableとは?

Equal (=) イコール
Equatable イコールできるようにする、つまり比較可能です。

つまり 今まで比較できなかったObject同士を比較できるようにするものです。大雑把にまとめると自分で作ったカスタムクラスなどです。

2. Equatableじゃない例

Teacherクラスを作ってみました。変数はnameただ一つです。

Teacher.swift
class Teacher{
    var name:String

    init(name: String) {
        self.name = name
    }
}

4人先生を作って名前を与えました。

var teachers:[Teacher] = []

var one = Teacher(name:"AJ")
var two = Teacher(name: "Bob")
var three = Teacher(name: "Amy")
var four = Teacher(name: "John")

teachers.append(one)
teachers.append(two)
teachers.append(three)
teachers.append(four)

name同士は比較できる! (String同士を比較しているため)

if one.name == two.name{
    print("match!")
}

でもクラス同士を比較するとエラーが起きる!

if one == two{
    print("same!")
}

if teachers[0] == teachers[1]{
}

Screen Shot 2017-07-07 at 2.00.20 PM.png

他にも Array.index(of: )が使えない!(これが一番困った。)
teachersの配列はTeacher構成されるため、比較できない。

if let index = teachers.index(of: teachers.name){
}

3. Equatableにしてみる

  1. まずTeacherクラスに:Equtableをつける必要がある。
  2. Teacherクラス内にEquatableメソッドを追加
Teacher.swift
class Teacher:Equatable{
    var name:String

    init(name: String) {
        self.name = name
    }

  func ==(lhs: Teacher, rhs: Teacher) -> Bool{
    return lhs.name == rhs.name
  }
}

比較メソッドの中の、lhs は 左側(left)のobject, rhs は 右側(right)のobjectを意味する。
比較判定方法を名前でしている。比較してみるとエラーが起きないはず!

print(one == two)
//false

※ 同じ名前じゃないため、falseを返している。

3. 複数変数でEquatableしてみる

Teacher.swift
class Teacher: Equatable{
    var name:String
    var age:Int

    init(name: String, age:Int) {
        self.name = name
        self.age = age
    }

    static func ==(lhs: Teacher, rhs: Teacher) -> Bool{
        return lhs.name == rhs.name && lhs.age == rhs.age
    }
}

こうすると、nameとageが同じかどうかが比較可能になりました。

コードはこちら!
https://github.com/Saayaman/swift/tree/master/Practices/Equatable

参考:
http://nshipster.com/swift-comparison-protocols/


『 Swift 』Article List