SE-0011: 付属型を宣言するための typealias キーワードを associatedtype に置き換える です。
これは非常に単純な話。ツッコミお待ちしています。
原文に従ってこの訳は Apache License 2.0 とします。
付属型を宣言するための typealias
キーワードを associatedtype
に置き換える
- 提案: SE-0011
- 著者: Loïc Lecrenier
- ステータス: Swift 2.2 に向けて受理された (Bug)
- レビューマネージャ: Doug Gregor
はじめに
現在 typealias
キーワードは 2 種類の型を宣言するために使われています。
- タイプエイリアス (既存の型の別名)
- 付属型 (プロトコルの一部として使われる型のプレースホルダの名前)
これら 2 種類の宣言は異なるものであり、別個のキーワードを使うべきです。これにより違いが強調され、付属型の使用を取り巻く混乱が幾らか減るでしょう。
提案する新しいキーワードは associatedtype
です。
動機
typealias
を関連型を宣言するために再利用することは様々な混乱を引き起こします。
- プロトコルの中の
typealias
は他の場所でのtypealias
と違う意味を持つことがはっきりしません。 - 初心者に付属型の存在を隠してしまいます。結果として間違った理解のコードを書いてしまいます。
- プロトコルの中では具体的なタイプエイリアスが禁止されていることがはっきりしません。
特に、2 + 3 のせいでプログラマは
protocol Prot {
typealias Container : SequenceType
typealias Element = Container.Generator.Element
}
というコードを Element
は Container.Generator.Element
のタイプエイリアスではなく、Contaner.Generator.Element
をデフォルトとする新しい付属型と気づかずに書いてしまいます。
しかし、このコード
protocol Prot {
typealias Container : SequenceType
}
extension Prot {
typealias Element = Container.Generator.Element
}
は Element
を Container.Generator.Element
のタイプエリアスであると宣言します。
言語が持っているこれらの非常に細かい部分のために、理解するには注意深い検討が必要になります。
提案手法
付属型を宣言する目的において、typealias
キーワードを associatedtype
で置き換えます。
これにより上で述べた問題が解決します:
-
typealias
はもう型の別名を宣言するためだけに使用できます。 - 初心者はもうプロトコルを作成するために付属型について学ぶことを避けては通れません。
- プロトコルの中で型の別名を作ろうとするとエラーメッセージを表示できるようになります。
以前のコードスニペットで示した混乱もなくなります。
protocol Prot {
associatedtype Container : SequenceType
typealias Element = Container.Generator.Element // error: cannot declare type alias inside protocol, use protocol extension instead
}
protocol Prot {
associatedtype Container : SequenceType
}
extension Prot {
typealias Element = Container.Generator.Element
}
他のキーワードを使いことも検討しました: type
, associated
, requiredtype
, placeholdertype
, …
提案手法
付属型を宣言する目的において、Swift 2.2 で associatedtype
を導入して typealias
を廃止予定とし、Swift 3 で typealias
を完全に取り除くことを提案します。
既存のコードへの影響
単純に 1 つのキーワードを別のものに置き換えるだけなので、associatedtype
への移行は既存のコードを壊す危険なしに簡単に自動化できるでしょう。