あなたの質問に答えるために、デバッグの目的でこれを実際に使用することができます。たとえば、ワークスペースがMyAwesomeWkspace
、プロジェクトがMyAwesomeProject
であるとします。
今度はMyAwesomeModule
と呼ばれるmodule
という新しいframework
を作成します。そのモジュールの中でPerson
と呼ばれる非公開クラスを作成します。
あなたがimport MyAwesomeModule
を行うことによってMyAwesomeProject
内のクラスPerson
を使用しようと、その後let p = Person()
のようなもの場合は、エラーになります。
しかし、@testable import MyAwesomeModule
を実行すると、魔法が発生し、クラスを使用できるようになります。
基本的に@testable
は、あなたが公表しなかったものをテストすることができます。この注釈はimport
と表示されます(here参照)。
したがって、非公開のメンバーにアクセスできるように、ターゲットは-enable-testing
でコンパイルされます。デフォルトでは、debug
ビルド構成が-enable-testing
、私はあなたが動作する示した例でコンパイルされている、ので、少なくともhere
何に基づきます。しかし、ビルドの設定をrelease
に変更すると、release
の設定がフラグで構築されていないので、エラーはModule .. was not compiled for testing
と表示されます。スウィフトプログラミング言語のアクセス制御 部(スイフト4)に記載のように
スウィフトアクセス制御モデル、アプリ またはフレームワークに内部として宣言何にアクセス 外部エンティティを防止します。デフォルトでは、 テストコードからこれらのアイテムにアクセスできるようにするには、アクセスレベルを少なくとも に上げる必要があり、Swiftのタイプセーフティのメリットはありません。
Xcodeのは、この問題には2部構成のソリューションを提供します:あなたは、テストのために、デフォルトで 真実であるはい]に設定を有効にテスタビリティのビルドを設定すると、新しいプロジェクトで構築し
、Xcodeは -enable-を含みコンパイル中にフラグをテストします。これにより、コンパイルされたモジュールで宣言されたSwiftエンティティは、より高いレベルのアクセスに適しています。 テストを有効にしてコンパイルした モジュールのインポートステートメントに@testable属性を追加すると、そのスコープ内のそのモジュールに対して昇格アクセス が有効になります。 内部または公開としてマークされたクラスおよびクラスメンバは、openとマークされているかのように動作します。他のエンティティ は、内部としてマークされているかのように、publicとして宣言されています。
もっとhere
後期編集:SWIFTのクールな部分の1つは、それがオープンソースです。もしあなたが "魔法"に深く没頭したいのであれば、それをチェックしてみてください:https://github.com/apple/swift
*実際には@ testableの後ろで何が起こっているのですか?コンパイラのように見えません。 – Caleb
私は裏で起こっていることに答えることができる唯一の人はアップルの従業員だと思います。 – JAL