Swift Academy · レッスン

制約(where)と型推論

where (例:Equatable/ComparableやElementの制約)でジェネリックコードに制約を付け、呼び出し時にSwiftがジェネリック型を推論する仕組みを学びます。

レッスン 2/38 ステップ

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

なぜ制約が必要なのか

ジェネリックコードで==や<など特定の演算を使えるようにするには制約を追加します。Swiftの型推論により、呼び出し時に具体的な型が選ばれます。

Equatable制約

where T: Equatableにより等価性のチェックが可能になります。これがなければ、任意のTに対して==は利用できません。

// Find the first index of value in an array of T
func indexOf<T>(_ value: T, in array: [T]) -> Int? where T: Equatable {
    for (i, x) in array.enumerated() {
        if x == value { return i }        // allowed because T: Equatable
    }
    return nil
}
print(indexOf(3, in: [1,2,3,2]) ?? -1)     // 2
print(indexOf("b", in: ["a","b","c"]) ?? -1)  // 1

Comparable制約

T: Comparableのような制約を使うと、<などの順序付け演算が可能になります。

// Return the minimum value of a collection when elements are Comparable
func minimum<T: Comparable>(_ xs: [T]) -> T? {
    guard var best = xs.first else { return nil }
    for x in xs.dropFirst() {
        if x < best { best = x }
    }
    return best
}
print(minimum([7,3,9]) ?? -1)    // 3
print(minimum(["b","a","c"]) ?? "?") // "a"

whereを使ったextension

where Element: ...を使うと、特定の要素型に対してのみAPIを追加できます(ここではEquatableの配列が対象です)。

// Add a helper only when the array's Element is Equatable
extension Array where Element: Equatable {
    func removingDuplicates() -> [Element] {
        var seen: [Element] = []
        for x in self {
            if !seen.contains(x) { seen.append(x) }
        }
        return seen
    }
}
print([1,2,2,3].removingDuplicates())   // [1,2,3]

複数の制約

制約は組み合わせられます。ジェネリック型とその関連型の両方に制約を付けます(例:S.Element: Equatable)。

// Require both Sequence and Equatable elements; force same-type relationship
func allEqual<S>(_ s: S) -> Bool
where S: Sequence, S.Element: Equatable {
    var it = s.makeIterator()
    guard let first = it.next() else { return true }
    while let v = it.next() { if v != first { return false } }
    return true
}
print(allEqual([2,2,2]))   // true
print(allEqual([1,2,1]))   // false

実際の型推論

Swiftは引数とコンテキストからジェネリックパラメーターを推論するため、<T>を明示的に指定することはほとんどありません。

// Inference: compiler deduces concrete types
let i = indexOf(10, in: [5,10,15])   // T is Int
let j = minimum(["z","x"])           // T is String
print(i ?? -1, j ?? "")

whereの意味

確認:where句は何をするのでしょうか。

まとめ

まとめ:where(例:T: Equatable、Element: Comparable)でジェネリクスに制約を付け、Swiftの型推論によって呼び出し時に具体的な型を選ばせます。

無料で開始

AI チューターと学ぶ Swift — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
122
レッスン
409

よくある質問

「制約(where)と型推論」レッスンは無料ですか?

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

「制約(where)と型推論」で何を学びますか?

where (例:Equatable/ComparableやElementの制約)でジェネリックコードに制約を付け、呼び出し時にSwiftがジェネリック型を推論する仕組みを学びます。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

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

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

「制約(where)と型推論」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

  1. ジェネリック関数とジェネリック型
  2. 制約(where)と型推論
  3. コレクションに対するジェネリックアルゴリズム
← Swift Academyに戻る