【Swift】associatedtypeとは?プロトコルへのジェネリックプログラミング
この記事からわかること
- Swiftのassociatedtypeとは?
- プロトコルでのジェネリクスプログラミング
- ジェネリクスとの違い
- 型への依存を下げるには?
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
associatedtypeキーワードとは?
Swiftのassociatedtype
キーワードはプロトコルで使用するジェネリック(具体的な型に依存しない)な型制約を定義するためのキーワードです。「associated
」は日本語で「関連する」という意味を持つ英単語です。
associatedtype 任意の型名
Swiftではジェネリックプログラミングに対応するためのジェネリクスという仕様が用意されています。ジェネリクスを使用することで特定の型に依存しない関数や構造体などを定義することができるようになります。一時的な型名としてT
が使用されることが多いです。
func judgeType<T> (one: T, two: T) -> T? {
print("oneのデータ型は\(type(of: one))")
print("twoのデータ型は\(type(of: two))")
return nil
}
それをプロトコルでも実装するために使用するキーワードがassociatedtype
キーワードのようです。
使われている場所
associatedtype
はSwiftにあらかじめ定義されているさまざまなプロトコルで利用されておりSwift UIの要であるView
プロトコルにも利用されています。
public protocol View {
associatedtype Body : View
@ViewBuilder var body: Self.Body { get }
}
見てみるとBody
型がassociatedtype
が定義されています。Body
型に関してはBody : View
となっているので最低限View
プロトコルに準拠している必要があります。
実際に使用してみる
プロトコル内で使用できるジェネリックな型を定義できるので、プロパティやメソッドとは異なり、以下のようにassociatedtype
キーワードを使って定義します。定義した型はプロトコル内のプロパティやメソッドで使用できるようになります。
protocol Printer {
associatedtype T
func execute(_ data: T )
}
class StringPrinter: Printer{
func execute(_ data:String) {
print(data)
}
}
class IntegerPrinter: Printer{
func execute(_ data:Int) {
print(data)
}
}
let strprinter = StringPrinter()
strprinter.execute("出力") // 出力
let intprinter = IntegerPrinter()
intprinter.execute(10) // 10
ご覧いただきありがとうございました。