0Pricing
Swift Academy · レッスン

Equatableの自動合成

==を自動的に利用し、必要に応じてカスタマイズします。

「Equatableの自動合成」はCoddyKit上の無料Swift Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSwift Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Swift Academyコースには全4レッスンが含まれています。

Equatableとは

Equatableは、型に==演算子を提供するプロトコルです。準拠すると、2つの値が等しいか比較でき、containsやfirstIndexなどでも使用できるようになります。

自動的な準拠

すべての格納プロパティがEquatableである構造体では、準拠を宣言するだけで、Swiftが==を自動生成してくれます。

struct Point: Equatable {
    let x: Int
    let y: Int
}
print(Point(x: 1, y: 2) == Point(x: 1, y: 2))  // true
print(Point(x: 1, y: 2) == Point(x: 9, y: 2))  // false

自動生成の仕組み

自動生成された==は、すべての格納プロパティを1組ずつ比較します。値が等しいとみなされるには、すべてが等しくなければなりません。

struct User: Equatable {
    let name: String
    let age: Int
}
let a = User(name: "Ann", age: 30)
let b = User(name: "Ann", age: 31)
print(a == b)  // false  (age differs)

コレクションでの==の使用

Equatableに準拠すると、配列のさまざまな操作を利用できるようになります。

struct Tag: Equatable { let name: String }
let tags = [Tag(name: "a"), Tag(name: "b")]
print(tags.contains(Tag(name: "b")))        // true
print(tags.firstIndex(of: Tag(name: "a"))!) // 0

列挙型もEquatableです

列挙型にもEquatableが自動生成されます。関連値のない列挙型は、宣言しなくてもEquatableになります。関連値がある場合は準拠を宣言すると、関連値も比較されます。

関連値を持つEquatable列挙型

関連値も比較に含まれます。

enum Status: Equatable {
    case active
    case error(code: Int)
}
print(Status.error(code: 404) == Status.error(code: 404))  // true
print(Status.error(code: 404) == Status.error(code: 500))  // false

ネストした型

自動生成は組み合わせて機能します。Equatableに準拠したメンバーを含む構造体自体も、自動生成の対象にできます。

struct Line: Equatable {
    let start: Int
    let end: Int
}
struct Shape: Equatable {
    let lines: [Line]
}
print(Shape(lines: [Line(start: 0, end: 1)]) == Shape(lines: [Line(start: 0, end: 1)]))  // true

自動生成できない場合

いずれかの格納プロパティがEquatableでない場合、自動生成は利用できないため、==を自分で実装する必要があります(後で説明します)。

struct Box: Equatable {
    let id: Int
    static func == (l: Box, r: Box) -> Bool { l.id == r.id }
}
print(Box(id: 1) == Box(id: 1))  // true

クラスでは自動生成されない

参照型には==が自動生成されないため、同一性またはフィールドを比較する実装を自分で用意する必要があります。

final class Account: Equatable {
    let id: Int
    init(id: Int) { self.id = id }
    static func == (l: Account, r: Account) -> Bool { l.id == r.id }
}
print(Account(id: 7) == Account(id: 7))  // true

!=も自動的に利用可能

==が存在すれば、その否定として!=も自動的に導出されます。

struct Color: Equatable { let hex: String }
print(Color(hex: "#fff") != Color(hex: "#000"))  // true

ジェネリックコードでのEquatable

Equatableにより、ジェネリック関数で要素を比較できるようになります。多くのアルゴリズムでこれが必要です。

func allSame<T: Equatable>(_ xs: [T]) -> Bool {
    guard let first = xs.first else { return true }
    return xs.allSatisfy { $0 == first }
}
print(allSame([2, 2, 2]))  // true
print(allSame(["a", "b"]))  // false

確認問題

Equatableを宣言したとき、Swiftが==を自動生成するのはどの型ですか。

まとめ

Equatableについて学びました。

  • Equatableは==(および自動的に利用できる!=)を提供します
  • Equatableのメンバーを持つ構造体と列挙型では、==が自動生成されます
  • contains、firstIndex(of:)などが利用可能になります
  • クラスやEquatableでないメンバーには、==の手動実装が必要です

次はHashableです。

よくある質問

「Equatableの自動合成」レッスンは無料ですか?

はい。「Equatableの自動合成」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Swift Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Swift Academyコースには全4レッスンが含まれています。

「Equatableの自動合成」で何を学びますか?

==を自動的に利用し、必要に応じてカスタマイズします。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Swift Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのSwift Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「Equatableの自動合成」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このSwift Academyレッスンでコードを書いて実行できますか?

はい。すべてのSwift Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Equatableの自動合成
  2. Hashableとhash(into:)
  3. Comparableとソート
  4. カスタム等価性のセマンティクス
← Swift Academyに戻る