LoginSignup
44
28

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-07-07

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/

44
28
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
44
28