制約(where)と型推論
where (例:Equatable/ComparableやElementの制約)でジェネリックコードに制約を付け、呼び出し時にSwiftがジェネリック型を推論する仕組みを学びます。
「制約(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) // 1Comparable制約
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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- ジェネリック関数とジェネリック型
- 制約(where)と型推論
- コレクションに対するジェネリックアルゴリズム