Site icon image技術メモ

[SE-0444]Member import visibility

参照


提案概要

  • ファイル内で、外部モジュールを利用している場合、明示的にそのモジュールをimportすることを強制する

なぜ必要か

  • 現状だと、別ファイルでimport文を書いたモジュールを参照できてしまう。これは理想的デザインではなく、各ファイルで明示的にimport文を用いてどのモジュールを利用しているのかをファイルごとに明らかにするべき(という意見)
    • これがなぜ問題になるのか
      • 同じ名前の関数が、依存している複数のモジュールでそれぞれ定義されており、かつ、別のファイルでimportされている場合、どのモジュール由来の関数を呼び出しているのか不明瞭になる場合がある
        • これは、`Ambiguous use of ~`errorとして検知される
        • 対策として、型を明示することでコンパイルエラーを防ぐことができるが、そもそも別ファイルに記載した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()' が出る

どのように使うか

  • 各ファイルでimport文を明示する

いつ使うか

  • 依存している複数モジュールに、同名のインターフェースが存在する場合

その他備考

  • Upcoming Feature Flag: MemberImportVisibility
  • この変更が適用されると、import文が不足しているファイル上ではコンパイルエラーになる予定