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

问题描述 投票:141回答:13

我只是想从其他文件中包含我的Swift类,比如它的测试

PrimeNumberModel.svift

import Foundation

class PrimeNumberModel { }

PrimeNumberModelTests.svift

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

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

两个swift文件都在同一目录中。

swift xcode6
13个回答
125
投票

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

摆脱:

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

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


1
投票

检查您的PrimeNumberModelTests目标设置。

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


0
投票

所以,你需要

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

在我的情况下,我有一个我想要单元测试的swift文件,单元测试文件也是一个快速的类。我确保访问修饰符是正确的,但声明

import stMobile

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

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

import St_Mobile

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

所以,总结一下:

  1. 检查您的产品模块名称,并使用下面的单元测试类中的import语句 import myProductModuleName
  2. 确保您的访问修饰符正确(类级别和方法)。

0
投票

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

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


0
投票

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

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


66
投票

更新Swift 2.x,3.x,4.x和5.x.

现在您不需要将public添加到要测试的方法中。在较新版本的Swift上,只需要添加@testable关键字。

PrimeNumberModelTests.svift

import XCTest
@testable import MyProject

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

而你的内部方法可以保持Internal

PrimeNumberModel.svift

import Foundation

class PrimeNumberModel {
   init() {
   }
}

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


Swift 1.x

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

  1. 您不需要导入Swift类,但需要导入外部模块(目标)
  2. Swift中的默认Access Control级别是Internal access

考虑到测试是在PrimeNumberModelTests.swift上的另一个目标,你需要import包含你要测试的类的目标,如果你的目标被调用MyProject需要将import MyProject添加到PrimeNumberModelTests

PrimeNumberModelTests.svift

import XCTest
import MyProject

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

但这还不足以测试你的类PrimeNumberModel,因为默认的访问控制级别是Internal Access,你的类将不会被测试包看到,所以你需要使它成为Public Access以及你要测试的所有方法:

PrimeNumberModel.svift

import Foundation

public class PrimeNumberModel {
   public init() {
   }
}

46
投票

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

只需使用:

let primNumber = PrimeNumberModel()

33
投票

检查测试目标中PrimeNumberModel.swift的目标成员身份。


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
投票

根据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
投票

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

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


4
投票

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

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

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


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类型。

© www.soinside.com 2019 - 2024. All rights reserved.