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にしてみる
- まずTeacherクラスに:Equtableをつける必要がある。
- 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