0Pricing
Swift Academy · レッスン

Comparableとソート

<で順序を定義し、ソートできるようにします。

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

Comparableとは

Comparableは、型に順序比較演算子<、<=、>、>=を提供します。準拠すると、sorted()、min()、max()を直接呼び出せるようになります。

< による準拠

実装する必要があるのは<だけで、残りは自動的に導出されます(Equatableへの準拠も必要です)。

struct Version: Comparable {
    let major: Int
    static func < (l: Version, r: Version) -> Bool { l.major < r.major }
}
print(Version(major: 1) < Version(major: 2))  // true

Comparableな型のソート

Comparableに準拠すると、sorted()にクロージャを渡す必要がありません。

struct Score: Comparable {
    let points: Int
    static func < (l: Score, r: Score) -> Bool { l.points < r.points }
}
let sorted = [Score(points: 3), Score(points: 1), Score(points: 2)].sorted()
print(sorted.map { $0.points })  // [1, 2, 3]

minとmaxをそのまま利用

Comparableに準拠すると、集約用のヘルパーも利用できます。

struct Temp: Comparable {
    let c: Int
    static func < (l: Temp, r: Temp) -> Bool { l.c < r.c }
}
let temps = [Temp(c: 20), Temp(c: 5), Temp(c: 30)]
print(temps.min()!.c, temps.max()!.c)  // 5 30

複数キーによる順序付け

複数のフィールドで同順位を解消するには、<の中で優先順位の高い順に比較します。タプルを使えば、Swiftがタプルを辞書順に比較してくれます。

タプル比較のテクニック

姓、次に名の順で比較します。

struct Person: Comparable {
    let last: String
    let first: String
    static func < (l: Person, r: Person) -> Bool {
        (l.last, l.first) < (r.last, r.first)
    }
}
let p = [Person(last: "Lee", first: "Bo"), Person(last: "Lee", first: "An")].sorted()
print(p.map { $0.first })  // ["An", "Bo"]

Comparableなしでソートする

型がComparableでなくても、末尾クロージャを使っていつでもソートできます。

struct Item { let name: String; let qty: Int }
let items = [Item(name: "B", qty: 2), Item(name: "A", qty: 5)]
let byQty = items.sorted { $0.qty > $1.qty }
print(byQty.map { $0.name })  // ["A", "B"]

降順ソート

比較を逆にするか、.reversed()を呼び出します。

let nums = [3, 1, 4, 1, 5]
print(nums.sorted(by: >))         // [5, 4, 3, 1, 1]
print(nums.sorted().reversed())   // [5, 4, 3, 1, 1]

sortedとsortの違い

sorted()は新しい配列を返し、sort()はその場で変更します(varが必要です)。

var nums = [3, 1, 2]
nums.sort()
print(nums)  // [1, 2, 3]
let copy = [3, 1, 2].sorted()
print(copy)  // [1, 2, 3]

安定性が保証されたソート

SwiftのソートはSwift 5以降、安定していることが保証されています。等しい要素は元の相対的な順序を保ちます。複数回のソートで予測可能な結果を得るには、これを利用できます。

let words = ["bb", "a", "cc", "d"]
let byLen = words.sorted { $0.count < $1.count }
print(byLen)  // ["a", "d", "bb", "cc"]  -- "a" before "d", "bb" before "cc"

キーパスによるソート

型全体を準拠させなくても、任意のプロパティを読み取るクロージャを使ってソートできます。

struct Player { let name: String; let score: Int }
let players = [Player(name: "A", score: 30), Player(name: "B", score: 50)]
let ranked = players.sorted { $0.score > $1.score }
print(ranked.map { $0.name })  // ["B", "A"]

確認問題

Comparableに準拠するために実装する必要がある単一の演算子はどれですか。

まとめ

Comparableについて学びました。

  • Comparableは順序比較演算子を提供し、実装するのは<だけです
  • クロージャなしでsorted()、min()、max()を利用できます
  • タプル比較により、複数キーによる順序付けを簡単に実現できます
  • sorted()は新しい配列を返し、sort()はその場で変更します。ソートは安定しています

次はカスタム等価性の意味です。

よくある質問

「Comparableとソート」レッスンは無料ですか?

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

「Comparableとソート」で何を学びますか?

<で順序を定義し、ソートできるようにします。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

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

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

「Comparableとソート」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

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