如何从另一个Swift文件导入Swift文件?
我只是想从另一个文件中包含我的Swift类,就像它的testing一样
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文件都在同一个目录下。
我也有同样的问题,也在我的XCTestCase
文件,但不是在正常的项目文件。
为了摆脱
使用未parsing的标识符“PrimeNumberModel”
我需要在testing文件中import
基本模块。 所以在我的情况下,我的目标被称为“myproject”,我添加了import myproject
和类被识别。
更新Swift 2.x和3.x
现在,您不需要将public
添加到要testing的方法。 在Swift 2上,只需要添加@testable
关键字。
PrimeNumberModelTests.swift
import XCTest @testable import MyProject class PrimeNumberModelTests: XCTestCase { let testObject = PrimeNumberModel() }
而你的内部方法可以保持Internal
PrimeNumberModel.swift
import Foundation class PrimeNumberModel { init() { } }
请注意,即使使用@testable
, private
(和fileprivate
)符号也不可用。
Swift 1.x
Swift有两个相关的概念(如Xcode 6 beta 6)。
- 你不需要导入Swift类,但是你需要导入外部模块(目标)
- Swift中的默认访问控制级别是
Internal access
考虑到testing是在PrimeNumberModelTests.swift
上的另一个目标,您需要import
包含您要testing的类的目标,如果您的目标被调用, MyProject
将需要添加import MyProject
到PrimeNumberModelTests
:
PrimeNumberModelTests.swift
import XCTest import MyProject class PrimeNumberModelTests: XCTestCase { let testObject = PrimeNumberModel() }
但是这不足以testing您的类PrimeNumberModel
,因为默认的访问控制级别是Internal Access
,所以您的类对于testing包是不可见的,所以您需要使其成为Public Access
和所有您想要testing的方法:
PrimeNumberModel.swift
import Foundation public class PrimeNumberModel { public init() { } }
在文件中说对swift编程没有import声明
只需使用:
let primNumber = PrimeNumberModel()
在您的testing目标中检查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() }
正如你所看到的,不需要导入。 希望这可以帮助。
根据苹果公司,你不需要在同一个目标的快速文件import。 我终于通过将我的swift文件添加到我的常规目标和testing目标中来工作。 然后,我使用桥接头进行testing,以确保我在常规桥接头中引用的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有你的testing目标的目标。 或者导入你的整个模块的High6解决scheme将工作
我能够通过清理我的构build来解决这个问题。
顶部菜单 – >产品 – >清洁或键盘快捷键: Shift + Cmd + K
从Swift 2.0开始,最佳实践是:
将@testable import MyApp
行添加到testing文件的顶部,其中“MyApp”是您的应用目标的产品模块名称 (可在您的应用目标的构build设置中查看)。 而已。
(请注意,产品模块名称将与您的应用程序目标名称相同,除非您的应用程序目标名称包含空格,这些空格将replace为下划线。例如,如果我的应用程序目标被称为“趣味游戏”,我会写@testable import Fun_Game
在我的testing顶端@testable import Fun_Game
。)
检查您的“PrimeNumberModelTests”目标设置。
如果在“构build阶段/编译源”中看不到PrimeNumberModel.swift文件,请添加它。
您需要为编译器添加一个例程作为入口点引用,因此添加一个main.swift文件,在这种情况下,该文件仅创build您的testing文件的一个实例:
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和XCTestCasetypes。
所以,你需要
- 导入您要使用的外部模块
- 并确保你想要使用的类和方法有正确的访问修饰符。
在我的情况下,我有一个我想unit testing的快速文件,unit testing文件也是一个快速的类。 我确定访问修饰符是正确的,但声明
import stMobile
(假设stMobile是我们的目标名称)
仍然没有工作(我仍然得到'没有这样的模块'错误),我检查了我的目标,它的名字确实是stMobile。 于是,我去了包装下的Build Settings,find了产品模块名称,出于某种原因,这叫做St_Mobile,所以我改变了我的导入语句
import St_Mobile
(这是产品模块名称 ),一切正常。
所以,总结一下:
-
检查您的产品模块名称,并在unit testing课程中使用下面的导入语句
import myProductModuleName
-
确保你的访问修饰符是正确的(类级别和你的方法)。
Swift编译器隐式search依赖Swift库的.swiftmodule
文件, .swiftmodule
需要显式导入。
Xcode可以为你构buildswift模块,或者参考railsware博客来获取swiftc的命令行指令。
正如@ high6和@ erik-p-hansen在@ high6给出的答案中指出的那样,可以通过导入PrimeNumberModel类所在的模块的目标来克服这个问题,这个模块在一个简单的项目中可能与您的项目名称相同。
在看这篇文章的时候,我碰到了在 Clayton McIlrath编写Swiftcast.tv的Swift第一个unit testing的文章。 它讨论了访问修饰符,展示了您正在使用的同一个问题的示例(但针对ViewController而不是模型文件),并展示了如何导入目标并通过将目标文件包含在目标中来解决访问修饰符问题除非你真的想要这样做,否则你不需要让你想要公开testing的课程。
我有一个特定的文件(在XCode 6.3)相同的问题。 它适用于所有其他文件,但是一个文件在源代码pipe理状态下显示为“A +”(重命名后),并且此文件中的类不会被其他文件识别。 所以,我知道错误不是由于缺lessimport
语句。
这个修复对我有效:
- 将文件内容备份到单独的文件中
- 从XCode项目中删除导致麻烦的文件
- 在项目中添加了一个新的swift文件
- 将备份文件中的内容复制到新文件中。