Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
Comparable / Hashable / Equatable
Swiftには型の同値判定・大小比較・ハッシュ化を可能にする標準プロトコル(『Equatable』『Comparable』『Hashable』)が用意されています。
プロトコル一覧
| プロトコル | 概要 |
|---|---|
| Equatable | == 演算子による同値判定を可能にします。 |
| Comparable | Equatable を継承し、< 演算子による大小比較を可能にします。<= / > / >= は自動生成されます。 |
| Hashable | Equatable を継承し、Set や Dictionary のキーとして使えるようにします。 |
| Identifiable | 一意の id プロパティを持つことを表します。SwiftUI でよく使います。 |
サンプルコード
// Equatable: 同値判定
struct Point: Equatable {
var x: Double
var y: Double
// == を実装(自動合成も可能だが明示的に書く例)
static func == (lhs: Point, rhs: Point) -> Bool {
return lhs.x == rhs.x && lhs.y == rhs.y
}
}
let p1 = Point(x: 1.0, y: 2.0)
let p2 = Point(x: 1.0, y: 2.0)
let p3 = Point(x: 3.0, y: 4.0)
print("p1 == p2: \(p1 == p2)")
print("p1 == p3: \(p1 == p3)")
// Comparable: 大小比較
struct Student: Comparable {
let name: String
let score: Int
// < だけ実装すれば <= / > / >= は自動生成
static func < (lhs: Student, rhs: Student) -> Bool {
return lhs.score < rhs.score
}
}
let students = [
Student(name: "Alice", score: 85),
Student(name: "Bob", score: 92),
Student(name: "Carol", score: 78)
]
let sorted = students.sorted()
for s in sorted {
print("\(s.name): \(s.score)点")
}
// Hashable: Set・Dictionary のキーに使用
struct Color: Hashable {
let r: Int, g: Int, b: Int
}
var colorSet: Set<Color> = [
Color(r: 255, g: 0, b: 0),
Color(r: 0, g: 255, b: 0),
Color(r: 255, g: 0, b: 0) // 重複は除去される
]
print("色の種類: \(colorSet.count)")
概要
struct や enum の全プロパティが『Equatable』『Hashable』に準拠していれば、準拠するだけで自動合成(synthesized conformance)が使えます。== や hashValue の実装を省略できます。
『Comparable』は『<』演算子のみ実装すれば、残り(<=, >, >=)はコンパイラが自動生成します。Hashable に準拠する型は == が等しければ hashValue も等しくなければなりません(Hashable の契約)。
プロトコルの基本についてはprotocol の基本 / 準拠を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。