型パラメータの制約
ジェネリックパラメータに適合要件を課します。
「型パラメータの制約」は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フィードバックを取得できます。ローカル設定は不要です。