別のSwiftファイルからSwiftファイルをインポートするにはどうすればよいですか?


154

テストのように、別のファイルから私のSwiftクラスを含めたいだけです

PrimeNumberModel.swift

import Foundation

class PrimeNumberModel { }

PrimeNumberModelTests.swift

import XCTest
import PrimeNumberModel  // gives me "No such module 'PrimeNumberModel'"

class PrimeNumberModelTests: XCTestCase {
    let testObject = PrimeNumberModel()  // "Use of unresolved identifier 'PrimeNumberModel'"    
}

両方のSwiftファイルは同じディレクトリにあります。



2
アップルのドキュメントによると、両方のファイルに同じターゲットがある場合、インポートは必要ありません。悲しいことに、テストには別の目標があります。考えられる1つの解決策は、yourModule / PrimeNumberModelを使用してインポート文を実行することです。
Alex Reynolds

@ joseph.hainline同じ問題に直面しています。どのように解決されますか?今、行き詰まっています。
開発者

回答:


131

私のXCTestCaseファイルにも同じ問題がありましたが、通常のプロジェクトファイルにはありませんでした。

を取り除くには:

未解決の識別子「PrimeNumberModel」の使用

importテストファイルのベースモジュールが必要でした。私の場合、私のターゲットは 'myproject'と呼ばれimport myproject、追加するとクラスが認識されました。


2
これにはもっと賛成票が必要です。ただ、テスト対象に.swiftファイルを追加するために助言答えは正確に間違っていないですが、それが行われる必要があります方法はありません
の下に

10
しかし、その中にスペースがある私のプロジェクト名「ワイルドライフリーグ」をどうするか?
アレンリンリ2014

59
Beta 4以降、アクセス制御の設定が正しいことを確認する必要もあります。テストするクラスとそのクラス内でテストする関数の両方を明示的にとして設定する必要がありますpublic。そうしXCTestCaseないと、サブクラスはテストしようとしているものを「見る」ことができません。私はこの最後の夜に数時間を無駄にしました:)
Erik P. Hansen

2
私が間違っていない場合、(ターゲットビルド設定の)製品モジュール名はターゲットの名前と常に同じであるとは限らず、importステートメントで使用する必要があるのはモジュールの名前です
csch

3
Swiftターゲットの名前にスペースが含まれている場合は、インポートステートメントでスペースをアンダースコアに置き換えることでインポートできます。「My Swift Class」は「My_Swift_Class」になります。
Cin316、2015年

70

Swift 2.x、3.x、4.x、および5.xの更新

これでpublic、テストするメソッドにを追加する必要がなくなりました。Swiftの新しいバージョンでは、@testableキーワードを追加するだけで済みます。

PrimeNumberModelTests.swift

import XCTest
@testable import MyProject

class PrimeNumberModelTests: XCTestCase {
    let testObject = PrimeNumberModel()
}

そして、あなたの内部メソッドは維持することができます Internal

PrimeNumberModel.swift

import Foundation

class PrimeNumberModel {
   init() {
   }
}

private(およびfileprivate)記号は、を使用しても使用できないことに注意してください@testable


Swift 1.x

Swiftには2つの関連する概念があります(Xcode 6ベータ6として)。

  1. Swiftクラスをインポートする必要はありませんが、外部モジュール(ターゲット)をインポートする必要があります
  2. Swift のデフォルトのアクセス制御レベルはInternal access

上のテストは、別のターゲットにされていることを考えるとPrimeNumberModelTests.swift、あなたがする必要がimportあなたの場合は、テストしたいというクラスが含まれているターゲットターゲットが呼ばれるMyProject追加する必要がありますimport MyProjectしますPrimeNumberModelTests

PrimeNumberModelTests.swift

import XCTest
import MyProject

class PrimeNumberModelTests: XCTestCase {
    let testObject = PrimeNumberModel()
}

ただし、これはクラスをテストするのに十分ではありません。PrimeNumberModelデフォルトのアクセス制御レベルはInternal Accessであるため、クラスはテストバンドルに表示されないので、クラスとテストするPublic Accessすべてのメソッドを作成する必要があります。

PrimeNumberModel.swift

import Foundation

public class PrimeNumberModel {
   public init() {
   }
}

デフォルトのアクセス制御を変更する方法はありますか?以前はpublic修飾子なしで問題なく実行されていた面白いケースがありました。その後、テストケースを移動しましたが、突然動作しなくなりました。
Metaphox 2014

少なくとも現在のバージョンのSwiftではそれは不可能だと思います。
ディオゴT

ありがとう。そして、私の問題は、Swiftファイルがテストケースでテストターゲットにビルドされないことであることがわかりました。
Metaphox 2014

1
はい、まさにそれが私が間違っていると感じた場所です-クラススイフトファイルをテストケースターゲットにビルドするべきではありません。素敵なブログ投稿!ありがとう。
Metaphox 2014

1
Xcode 5以降で作成されたプロジェクトがあり、「パブリックアクセス、ターゲットモジュールのインポート」アプローチを選択している場合、メインターゲットと同じである可能性があるため、テストターゲットのモジュール名を再確認してください。あなたが受けている場合はNo such module <moduleName>、あなたのテストケースには、コンパイルエラーをあなたが確認したいことがありPRODUCT_MODULE_NAME、テスト対象のために。いい答えディオゴ。
クリス

48

ではドキュメントはスウィフトにはimport文が存在しないと言います。

ここに画像の説明を入力してください

単に使用してください:

let primNumber = PrimeNumberModel()

2
これは機能しましたが、クラスが最終的に表示されるように、Xcode 6.0を閉じて再度開く必要がありました。プロジェクトのクリーンアップとビルドも試してください。
user3344977 14

これは、最新のXCode 6.3ベータ版の新機能(または問題)のようです。そのため、今はインポート文が必要です。また、モジュールをインポートするためのインポートステートメントがSwiftにあります。
Augunrik、2015年

提供されたドキュメントによると、「インポートステートメントがない」というこのテーブルは、「同じターゲットからのインポート」のケースに関連しています。別の(テスト)ターゲットを使用するXCTestの場合は、記事の「外部フレームワークのインポート」セクションを確認してください。別の表があります。任意の言語フレームワーク-> Swiftへのインポート->「FrameworkName」のインポートが必要です
Igor Vasilev

エディターで問題が発生した場合、多くの場合、クラスが含まれていないテストターゲットがあります。したがって、おそらく実行可能な罰金を構築しますが、いずれかのターゲットに問題がある場合でも、エラーが表示されます。これらの他のターゲットのいずれかを選択した場合は、コンパイルできません。
Joel Teply、2015年

34

テストターゲットでPrimeNumberModel.swiftのターゲットメンバーシップを確認します。


1
これをコメントとして追加してください。
4dgaurav 2014年

8
この人はできません。そうするためには、9人の担当者が必要です(執筆時点)。
AlbertEngelB 14

1
いったい何が標的なのか?
ユーザー

これは私のために働いてくれてありがとう。クラスファイルをクリックします。右側のインスペクター列の最初のタブを確認してください。2番目のセクションは「ターゲットメンバーシップ」です。クラスを含めようとしているターゲット/製品が選択されていることを確認してください。
Hairgami_Master 2015年

1
これは、「インポートの方法」という質問に対する厳密な回答ではありませんが、ここに持ってきた質問に答えました(新しいファイルをターゲットに追加するのを忘れていました)。ですから、私や、「swift unresolved identifier class」の最初のgoogle結果に従ってここに到着する他の人にとって、これ答えです(コメントではありません)。
noamtm 2015年

17

Objective-Cでは、クラスを別のファイルで使用したい場合は、それをインポートする必要がありました。

#import "SomeClass.h"

ただし、Swiftでは、インポートする必要はありません。インポート済みのように使用するだけです。

// This is a file named SomeClass.swift

class SomeClass : NSObject {

}

// This is a different file, named OtherClass.swift

class OtherClass : NSObject {
    let object = SomeClass()
}

ご覧のとおり、インポートは必要ありませんでした。お役に立てれば。


ありがとう!Swiftからこの新しいものをすべて回避しています。
フェリペ

5

アップルによると、同じターゲット内の迅速なファイルのインポートは必要ありません。私のスイフトファイルを通常のターゲットとテストターゲットの両方に追加することで、ようやく動作しました。次に、テストにブリッジヘッダーを使用して、通常のブリッジヘッダーで参照したObjCファイルが利用可能であることを確認しました。今魅力のように走った。

import XCTest
//Optionally you can import the whole Objc Module by doing #import ModuleName

class HHASettings_Tests: XCTestCase {

override func setUp() {
    let x : SettingsTableViewController = SettingsTableViewController()

    super.setUp()
    // Put setup code here. This method is called before the invocation of each test method in the class.
}

override func tearDown() {
    // Put teardown code here. This method is called after the invocation of each test method in the class.
    super.tearDown()
}

func testExample() {
    // This is an example of a functional test case.
    XCTAssert(true, "Pass")
}

func testPerformanceExample() {
    // This is an example of a performance test case.
    self.measureBlock() {
        // Put the code you want to measure the time of here.
    }
}

}

したがって、PrimeNumberModelにテストターゲットのターゲットがあることを確認してください。または、モジュール全体をインポートするHigh6ソリューションが機能します


これはロジック/モデルクラスでのみ機能しますか、それともアプリケーションデリゲートでも使用できますか?
Nicolas Miari

5

ビルドをクリーンアップすることで、この問題を解決することができました。

トップメニュー->製品->クリーンまたはキーボードショートカット:Shift+ Cmd+K


4

Swift 2.0以降のベストプラクティスは次のとおりです。

@testable import MyAppテストファイルの先頭に行を追加します。「MyApp」はアプリターゲットの製品モジュール名です(アプリターゲットのビルド設定で表示可能)。それでおしまい。

(アプリターゲットの名前にスペースが含まれている場合を除き、製品モジュール名はアプリターゲットの名前と同じになります。スペースはアンダースコアに置き換えられます。たとえば、アプリターゲットが「Fun Game」と呼ばれていた場合@testable import Fun_Game、私のテストのトップ。)


1

コンパイラがエントリポイントとして参照するルーチンを追加する必要があるため、main.swiftファイルを追加します。この場合、テストファイルのインスタンスが作成されます。

main.swift

PrimeNumberModelTests()

次に、コマンドラインでコンパイルします(私はEl CapitanとSwift 2.2を使用しています):

xcrun -sdk macosx swiftc -emit-executable -o PrimeNumberMain PrimeNumberModel.swift PrimeNumberModelTests.swift main.swift

この場合、警告が表示されます。初期化子の結果は使用されていませんが、プログラムはコンパイルされ、実行可能です。

./PrimeNumberMain

警告:簡単にするために、インポートXCTestおよびXCTestCaseタイプを削除しました。


1

PrimeNumberModelTestsターゲット設定を確認してください。

PrimeNumberModel.swiftビルドPhases/Compile Sourcesでファイルが表示されない場合は、追加します。


これは正しい方法ではありません。High6の応答を確認してください。
ディオゴT

0

だから、あなたはする必要があります

  1. 使用したい外部モジュールをインポートする
  2. また、使用するクラスとメソッドに適切なアクセス修飾子があることを確認してください。

私の場合、単体テストをしたいSwiftファイルがあり、単体テストファイルもSwiftクラスでした。アクセス修飾子が正しいことを確認しましたが、ステートメント

import stMobile

(stMobileがターゲット名であるとしましょう)

それでも機能しません(まだ「No such module」エラーが発生していました)、ターゲットをチェックしましたが、その名前は確かにstMobileでした。だから、私はパッケージの下のビルド設定に行って、製品モジュール名を見つけました、そしてなぜかこれはSt_Mobileと呼ばれていたので、インポートステートメントを変更しました

import St_Mobile

(これは製品モジュール名です)、そしてすべてが機能しました。

したがって、要約すると:

  1. 製品モジュール名を確認し、単体テストクラスで以下のインポートステートメントを使用してください

    import myProductModuleName
  2. アクセス修飾子が正しいことを確認してください(クラスレベルとメソッド)。


0

明示的なインポートを要求する代わりに、Swiftコンパイラー.swiftmoduleは依存関係のあるSwiftライブラリーのファイルを暗黙的に検索します。

Xcodeはあなたのために迅速なモジュールを構築することができます、またはコマンドラインの手順についてはrailswareブログを参照してくださいswiftc


0

@ high6と@ erik-p-hansenが@ high6の回答で指摘したように、PrimeNumberModelクラスが存在するモジュールのターゲットをインポートすることでこれを克服できます。これは、おそらく単純なプロジェクトのプロジェクトと同じ名前です。 。

これを見ていると、Clayton McIlrathによるswiftcast.tv でSwiftの最初の単体テストを書くという記事に出くわしました。アクセス修飾子について説明し、同じ問題(モデルファイルではなくViewControllerの場合)の例を示し、ターゲットをインポートする方法と、ターゲットに宛先ファイルを含めることでアクセス修飾子の問題を解決する方法を示します。テストしようとしているクラスを実際に公開する必要がない限り、公開する必要はありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.