如何从另一个Swift文件导入Swift文件?

时间:2014-06-04 05:35:35

标签: swift xcode6

我只是想从其他文件中包含我的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文件都在同一个目录中。

13 个答案:

答案 0 :(得分:124)

我有同样的问题,也在我的XCTestCase文件中,但在常规项目文件中没有。

摆脱:

  

使用未解析的标识符'PrimeNumberModel'

我需要import测试文件中的基本模块。在我的情况下,我的目标被称为“myproject”,我添加了import myproject并且该类已被识别。

答案 1 :(得分:66)

更新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() {
   }
}

请注意,即使使用privatefileprivate(和@testable)符号也不可用。


Swift 1.x

Swift有两个相关概念(如Xcode 6 beta 6)。

  1. 您不需要导入Swift类,但需要导入外部模块(目标)
  2. Swift中的默认Access Control级别为Internal access
  3. 考虑到PrimeNumberModelTests.swift上的其他目标上的测试,如果您的目标被调用,则需要import包含您要测试的类的目标MyProject 1}}需要将import MyProject添加到PrimeNumberModelTests

    <强> PrimeNumberModelTests.swift

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

    但这还不足以测试您的课程PrimeNumberModel,因为默认的访问控制级别为Internal Access,您的课程对测试包不可见,因此您需要将其设为{ {1}}以及您要测试的所有方法:

    <强> PrimeNumberModel.swift

    Public Access

答案 2 :(得分:46)

Documentation中,它说Swift中没有import语句。

enter image description here

只需使用:

let primNumber = PrimeNumberModel()

答案 3 :(得分:33)

检查测试目标中PrimeNumberModel.swift的目标成员资格。

答案 4 :(得分: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()
}

如您所见,不需要导入。希望这会有所帮助。

答案 5 :(得分:5)

根据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解决方案将起作用

答案 6 :(得分:5)

我能够通过清理我的构建来解决这个问题。

热门菜单 - &gt;产品 - &gt;清洁 或键盘快捷键: Shift + Cmd + K

答案 7 :(得分:4)

从Swift 2.0开始,最佳做法是:

将行@testable import MyApp添加到测试文件的顶部,其中&#34; MyApp&#34;是您的应用目标的产品模块名称(可在应用目标&#39> 构建设置中查看)。那就是它。

(请注意,产品模块名称将与您的应用目标名称相同,除非您的应用目标名称包含空格,这些空格将替换为下划线。例如,如果我的app target被叫做#34; Fun Game&#34;我在测试的顶部写@testable import Fun_Game。)

答案 8 :(得分:1)

检查您的PrimeNumberModelTests目标设置。

如果您无法在Build PrimeNumberModel.swift中看到Phases/Compile Sources文件,请将其添加。

答案 9 :(得分: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

CAVEAT:为简单起见,我删除了导入XCTest和XCTestCase类型。

答案 10 :(得分:0)

所以,你需要

  1. 导入您要使用的外部模块
  2. 并确保您在要使用的类和方法上拥有正确的访问修饰符。
  3. 在我的情况下,我有一个我想要进行单元测试的快速文件,单元测试文件也是一个快速的类。我确保访问修饰符是正确的,但声明

    import stMobile
    

    (假设stMobile是我们的目标名称)

    仍然没有工作(我仍然得到'没有这样的模块'错误),我检查了我的目标,它的名字确实是stMobile。所以,我去了打包下的Build Settings,找到了Product Module Name,由于某种原因,这被称为St_Mobile,所以我改变了我的import语句

    import St_Mobile
    

    (这是产品模块名称),一切正常。

    所以,总结一下:

    1. 检查您的产品模块名称,并使用下面的单元测试类

      中的import语句
      import myProductModuleName
      
    2. 确保您的访问修饰符正确(班级和您的方法)。

答案 11 :(得分:0)

Swift编译器不是要求显式导入,而是隐式搜索依赖Swift库的.swiftmodule文件。

Xcode可以为您构建swift模块,或者参考railsware blog获取swiftc的命令行说明。

答案 12 :(得分:0)

正如@ high6和@ erik-p-hansen在@ high6给出的答案中指出的那样,可以通过导入PrimeNumberModel类所在模块的目标来克服这个问题,该模块可能与您的项目名称相同。一个简单的项目。

在看这个时,我在Clayton McIlrath的swiftcast.tv上看到了文章Write your first Unit Test in Swift。它讨论了访问修饰符,显示了您遇到的相同问题的示例(但对于ViewController而不是模型文件),并显示如何通过在目标中包含目标文件来导入目标并解决访问修饰符问题,这意味着除非你真的想这样做,否则你不必参加公开考试的课程。