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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Equatableの自動合成
- Hashableとhash(into:)
- Comparableとソート
- カスタム等価性のセマンティクス