Edited at

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

More than 1 year has passed since last update.


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]{
}

他にも 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/