参照
提案概要
- ファイル内で、外部モジュールを利用している場合、明示的にそのモジュールをimportすることを強制する
なぜ必要か
- 現状だと、別ファイルでimport文を書いたモジュールを参照できてしまう。これは理想的デザインではなく、各ファイルで明示的にimport文を用いてどのモジュールを利用しているのかをファイルごとに明らかにするべき(という意見)
- これがなぜ問題になるのか
- 同じ名前の関数が、依存している複数のモジュールでそれぞれ定義されており、かつ、別のファイルでimportされている場合、どのモジュール由来の関数を呼び出しているのか不明瞭になる場合がある
- これは、`Ambiguous use of ~`errorとして検知される
- 対策として、型を明示することでコンパイルエラーを防ぐことができるが、そもそも別ファイルに記載したimport文に影響を受けるのは理想的なデザインではないという問題提起
- 同じ名前の関数が、依存している複数のモジュールでそれぞれ定義されており、かつ、別のファイルでimportされている場合、どのモジュール由来の関数を呼び出しているのか不明瞭になる場合がある
- これがなぜ問題になるのか
- 例
- 以下二つのモジュールにそれぞれ parse() が定義されていて、モジュール内のファイルでimportしている
// RecipeKit interface public struct Recipe { /*...*/ } extension String { /// Returns the recipe represented by this string. public func parse() -> Recipe? }// GroceryKit interface public struct GroceryList { /*...*/ } extension String { /// Returns the grocery list represented by this string. public func parse() -> GroceryList? } - その場合、従来では型推論を用いてコンパイルエラーを防いでいた
let recipe: Recipe? = "2 slices of bread, 1.5 tbs peanut butter".parse() // OK - 今後はimport文を明示するべきという提案
// main.swift import RecipeKit let recipe = "2 slices of bread, 1.5 tbs peanut butter".parse() // 従来ならerror: Ambiguous use of 'parse()' が出る
- 以下二つのモジュールにそれぞれ parse() が定義されていて、モジュール内のファイルでimportしている
どのように使うか
- 各ファイルでimport文を明示する
いつ使うか
- 依存している複数モジュールに、同名のインターフェースが存在する場合
その他備考
- Upcoming Feature Flag:
MemberImportVisibility - この変更が適用されると、import文が不足しているファイル上ではコンパイルエラーになる予定
技術メモ