如何从另一个 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 文件都在同一个目录中。

178751 次浏览

文件中,它说在 Swift 中没有导入语句。

enter image description here

简单使用:

let primNumber = PrimeNumberModel()

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

除去:

使用未解析的标识符‘ PrimeNumberModel’

我需要 import的测试文件中的基本模块。在我的情况下,我的 目标被称为“我的项目”,我添加了 import myproject和类被认可。

根据苹果的说法,你不需要在同一个目标中导入快捷文件。我最终将我的快速文件添加到我的常规目标和测试目标中,使它工作起来。然后使用桥接头进行测试,以确保在常规桥接头中引用的 ObjecC 文件可用。现在跑得很快。

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 有一个测试目标的目标。或高6解决方案的导入您的整个模块将工作

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

检查你的 PrimeNumberModelTests目标设置。

如果在 BuildPhases/Compile Sources中看不到 PrimeNumberModel.swift文件,请添加它。

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

注意,即使使用 @testableprivate(和 fileprivate)符号也不可用。


Swift 1. x

这里有两个来自 Swift 的相关概念(如 Xcode 6 beta 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() {
}
}

所以,你需要

  1. 导入要使用的外部模块
  2. 并确保在要使用的类和方法上具有正确的访问修饰符。

在我的例子中,我有一个需要单元测试的快速文件,而单元测试文件也是一个快速类。我确保访问修饰符是正确的,但语句

import stMobile

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

仍然不工作(我仍然得到’没有这样的模块’错误) ,我检查了我的目标,它的名字确实是 stMobile。因此,我在打包状态下进入 Build Settings,找到了 Product Module Name,由于某种原因,它被称为 St _ Mobile,所以我更改了导入语句

import St_Mobile

(这是 产品模块名称) ,一切工作。

所以,总结一下:

  1. 检查“产品模块名称”并在单元测试类中使用下面的导入语句

    import myProductModuleName
    
  2. Make sure your access modifiers are correct (class level and your methods).

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

Xcode 可以为您构建快速模块,或者参考 Railsware 博客获取 swiftc的命令行指令。

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

在看这篇文章的时候,我偶然看到了 Clayton McIlrath 在 Swiftcast.tv 上发表的一篇文章 用 Swift 编写你的第一个单元测试。它讨论了访问修饰符,展示了一个与您相同的问题的例子(但是针对 ViewController 而不是模型文件) ,并展示了如何通过在目标中包含目标文件来导入目标和解决访问修饰符问题,这意味着您不必将您试图测试的类公开,除非您确实想这样做。

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

顶部菜单-> 产品-> 清洁 快捷键: Shift + Cmd + K

至于 Swift 2.0,最佳实践是:

将代码行 @testable import MyApp添加到测试文件的顶部,其中“ MyApp”是应用程序目标的 产品模块名称(可以在 应用程序目标的构建设置中查看)。就是这样。

(请注意,产品模块名称将与您的应用程序目标的名称相同,除非您的应用程序目标的名称包含空格,这将被替换为下划线。例如,如果我的应用程序目标被称为“有趣的游戏”,我会在测试的顶部编写 @testable import Fun_Game。)

您需要添加一个例程,让编译器将其作为入口点引用,因此添加 main.ift 文件,在本例中,该文件只是创建测试文件的一个实例:

主要的,迅速的

PrimeNumberModelTests()

然后在命令行上编译(我使用的是 El Capitan 和 Swift 2.2) :

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

在这种情况下,您会得到一个警告: 初始值设定项的结果未使用,但是程序可以编译并且是可执行的:

./PrimeNumberMain

注意: 为了简单起见,我删除了 import XCTest 和 XCTestCase 类型。