0Pricing
Swift Academy · レッスン

型パラメータの制約

ジェネリックパラメータに適合要件を課します。

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

ジェネリクスのまとめ

ジェネリック関数は、<T>のような型パラメーターを使うことで、多くの型に対応できます。ただし、制約のないTに対してできるのは値を受け渡すことだけで、内容を調べることはできません。制約によって機能を利用できるようになります。

func identity<T>(_ x: T) -> T { x }
print(identity(5))
print(identity("hi"))

Comparable制約

<T: Comparable>と記述すると、T型の値が<や>などをサポートすることが保証されるため、値を比較できます。

func largest<T: Comparable>(_ a: T, _ b: T) -> T {
    a > b ? a : b
}
print(largest(3, 9))
print(largest("apple", "pear"))

制約が必要な理由

Comparableがなければ、すべての型がa > bをサポートするわけではないため、コンパイラーはこの式を拒否します。制約は、その操作を合法にする保証です。

func minOf<T: Comparable>(_ list: [T]) -> T? {
    list.min()
}
print(minOf([4, 2, 8])!)

Equatable制約

Equatableによって、==と!=を使えるようになります。一致する要素の個数を数えたり、検索したりする場合に使用します。

func count<T: Equatable>(_ x: T, in list: [T]) -> Int {
    list.filter { $0 == x }.count
}
print(count(2, in: [2, 3, 2, 2]))

Hashable制約

Hashableに適合すると、値をSetの要素や辞書のキーとして使用できます。

func unique<T: Hashable>(_ list: [T]) -> [T] {
    Array(Set(list))
}
print(unique([1, 1, 2, 3, 3]).sorted())

プロトコル制約

どのプロトコルでも制約にできます。ここでは、カスタムプロトコルによってジェネリックパラメーターでそのメソッドを利用できるようにしています。

protocol Speaker { func speak() -> String }
struct Dog: Speaker { func speak() -> String { "Woof" } }

func announce<T: Speaker>(_ x: T) {
    print(x.speak())
}
announce(Dog())

クラス制約

Tが特定のクラスを継承することを要求し、そのクラスのメンバーを利用できるようにすることもできます。

class Animal { func name() -> String { "animal" } }
class Cat: Animal { override func name() -> String { "cat" } }

func describe<T: Animal>(_ x: T) { print(x.name()) }
describe(Cat())

複数の制約

&を使って制約を組み合わせ、複数のプロトコルへの適合を一度に要求できます。

func show<T: CustomStringConvertible & Equatable>(_ a: T, _ b: T) {
    print(a.description, a == b)
}
show(5, 5)

複数の型パラメーター

関数には、複数の制約付きパラメーターを持たせることができ、それぞれに独自の要件を設定できます。

func zipMap<K: Hashable, V>(_ keys: [K], _ vals: [V]) -> [K: V] {
    var d: [K: V] = [:]
    for (k, v) in zip(keys, vals) { d[k] = v }
    return d
}
print(zipMap(["a", "b"], [1, 2]))

型に対する制約

ジェネリック型にも、関数と同じように制約を指定できます。ジェネリック構造体で、パラメーターがプロトコルに適合することを要求できます。

struct SortedBox<T: Comparable> {
    var items: [T]
    var smallest: T? { items.min() }
}
print(SortedBox(items: [5, 1, 9]).smallest!)

数値に関する制約

Numericのような標準プロトコルを使うと、ジェネリックコードでIntやDoubleなどの型に対して算術演算を行えます。

func sum<T: Numeric>(_ list: [T]) -> T {
    list.reduce(0, +)
}
print(sum([1, 2, 3]))
print(sum([1.5, 2.5]))

理解度チェック

型パラメーターの制約についての理解度を確認しましょう。

まとめ

型パラメーターの制約(<T: Protocol>または<T: SomeClass>)は、ジェネリック型で何ができるかをコンパイラーに伝えます。Comparable、Equatable、Hashable、Numeric、カスタムプロトコル、クラス制約、&による複数の制約、ジェネリック型に対する制約について確認しました。

よくある質問

「型パラメータの制約」レッスンは無料ですか?

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

「型パラメータの制約」で何を学びますか?

ジェネリックパラメータに適合要件を課します。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

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

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

「型パラメータの制約」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

  1. 型パラメータの制約
  2. 関数のwhere句
  3. 関連型の制約
  4. ジェネリックなサブスクリプトとエクステンション
← Swift Academyに戻る