web-dev-qa-db-ja.com

他のSwiftファイルからSwiftファイルをインポートする方法

テストのように、私は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ファイルは同じディレクトリにあります。

141
joseph.hainline

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

を取り除くために:

未解決の識別子 'PrimeNumberModel'の使用

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

125
H6.

UPDATE 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の別のターゲットにあることを考慮すると、targetimportと呼ばれる場合、テストするクラスを含むターゲットをMyProjectする必要がありますimport MyProjectPrimeNumberModelTestsに:

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() {
   }
}
67
Diogo T

ドキュメント にはSwiftにimport文はないと書かれています。

enter image description here

単に使用する:

let primNumber = PrimeNumberModel()
46
Nitin Gohel

テストターゲットでPrimeNumberModel.Swiftのtarget-membershipを確認してください。

33
kimkkikki

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()
}

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

17
Fomentia

Appleによれば、同じターゲットにSwiftファイルをインポートする必要はありません。 Swiftファイルを通常のターゲットとテストターゲットの両方に追加することで、ようやく機能するようになりました。次に、テスト用のブリッジヘッダーを使用して、通常のブリッジヘッダーで参照している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の解決策はうまくいくでしょう。

5
Alex Reynolds

私は自分の作品をきれいにすることでこの問題を解決することができました。

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

5
Peter Fisher

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

テストファイルの先頭に@testable import MyAppという行を追加します。ここで、 "MyApp"はアプリケーションターゲットの製品モジュール名です(アプリケーションターゲットので表示可能) )設定を構築します。それでおしまい。

(アプリケーションターゲットの名前にスペースが含まれていない限り、製品モジュールの名前はアプリケーションターゲットの名前と同じになります。スペースはアンダースコアに置き換えられます。 「テストの先頭に@testable import Fun_Gameを書きます。)

4
George WS

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

Build PrimeNumberModel.SwiftPhases/Compile Sourcesファイルが見えない場合は、それを追加してください。

1
Bumseok

コンパイラがエントリポイントとして参照するためのルーチンを追加する必要があるので、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
Pinecone

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

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

0
mr_sd

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

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

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

import stMobile

(stMobileが私たちのターゲットネームであるとしましょう)

まだ動作しませんでした(私はまだ 'そのようなモジュールがありません'というエラーが出ていました)、私はターゲットをチェックしました、そしてその名前は確かにstMobileでした。それで、私はパッケージの下のBuild Settingsに行き、Product Module Nameを見つけました、そして、なぜかこれはSt_Mobileと呼ばれたので、私は私のimportステートメントを変更しました

import St_Mobile

(これは製品モジュール名です)、そしてすべてうまくいきました。

要約すると、

  1. 製品モジュール名を確認して、単体テストクラスで下記のimport文を使用してください。

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

0
Cloud9999Strife

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

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

0
mcandre