LoginSignup
8
8

More than 5 years have passed since last update.

Swift 2.2の新機能: SE-0011: 付属型を宣言するための typealias キーワードを associatedtype に置き換える

Posted at

SE-0011: 付属型を宣言するための typealias キーワードを associatedtype に置き換える です。
これは非常に単純な話。ツッコミお待ちしています。
原文に従ってこの訳は Apache License 2.0 とします。

付属型を宣言するための typealias キーワードを associatedtype に置き換える

はじめに

現在 typealias キーワードは 2 種類の型を宣言するために使われています。

  1. タイプエイリアス (既存の型の別名)
  2. 付属型 (プロトコルの一部として使われる型のプレースホルダの名前)

これら 2 種類の宣言は異なるものであり、別個のキーワードを使うべきです。これにより違いが強調され、付属型の使用を取り巻く混乱が幾らか減るでしょう。

提案する新しいキーワードは associatedtype です。

動機

typealias を関連型を宣言するために再利用することは様々な混乱を引き起こします。

  1. プロトコルの中の typealias は他の場所での typealias と違う意味を持つことがはっきりしません。
  2. 初心者に付属型の存在を隠してしまいます。結果として間違った理解のコードを書いてしまいます。
  3. プロトコルの中では具体的なタイプエイリアスが禁止されていることがはっきりしません。

特に、2 + 3 のせいでプログラマは

protocol Prot {
    typealias Container : SequenceType
    typealias Element = Container.Generator.Element
}

というコードを ElementContainer.Generator.Element のタイプエイリアスではなく、Contaner.Generator.Element をデフォルトとする新しい付属型と気づかずに書いてしまいます。

しかし、このコード

protocol Prot {
    typealias Container : SequenceType
}
extension Prot {
    typealias Element = Container.Generator.Element
}

ElementContainer.Generator.Element のタイプエリアスであると宣言します。

言語が持っているこれらの非常に細かい部分のために、理解するには注意深い検討が必要になります。

提案手法

付属型を宣言する目的において、typealias キーワードを associatedtype で置き換えます。

これにより上で述べた問題が解決します:

  1. typealias はもう型の別名を宣言するためだけに使用できます。
  2. 初心者はもうプロトコルを作成するために付属型について学ぶことを避けては通れません。
  3. プロトコルの中で型の別名を作ろうとするとエラーメッセージを表示できるようになります。

以前のコードスニペットで示した混乱もなくなります。

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 への移行は既存のコードを壊す危険なしに簡単に自動化できるでしょう。

メーリングリスト

8
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
8