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

jos*_*ine 142 swift xcode6

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

PrimeNumberModel.swift

import Foundation

class PrimeNumberModel { }
Run Code Online (Sandbox Code Playgroud)

PrimeNumberModelTests.swift

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

class PrimeNumberModelTests: XCTestCase {
    let testObject = PrimeNumberModel()  // "Use of unresolved identifier 'PrimeNumberModel'"    
}
Run Code Online (Sandbox Code Playgroud)

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

H6.*_*H6. 128

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

摆脱:

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

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

  • 从Beta 4开始,您还需要确保您的访问控制设置正确无误.您需要明确地将您正在测试的类和您在该类中测试的函数设置为"public".否则,`XCTestCase`子类将无法"看到"您要测试的内容.我昨晚浪费了几个小时:) (59认同)
  • 但是如何处理我的项目名称"野生动物联盟",其中有空间? (10认同)
  • 如果Swift目标的名称中有空格,则可以通过在import语句中用下划线替换空格来导入它."我的Swift Class"变成了"My_Swift_Class". (3认同)
  • 这需要更多的赞成.建议只将.swift文件添加到测试目标的答案并非完全错误,但这不是它应该完成的方式 (2认同)
  • 如果我没弄错的话,**产品模块名称**(在目标构建设置中)并不总是与目标的名称相同,它是应该在`import`语句中使用的模块名称 (2认同)

Dio*_*o T 67

更新Swift 2.x和3.x.

现在您不需要public将方法添加到测试中.在Swift 2上,只需要添加@testable关键字.

PrimeNumberModelTests.swift

import XCTest
@testable import MyProject

class PrimeNumberModelTests: XCTestCase {
    let testObject = PrimeNumberModel()
}
Run Code Online (Sandbox Code Playgroud)

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

PrimeNumberModel.swift

import Foundation

class PrimeNumberModel {
   init() {
   }
}
Run Code Online (Sandbox Code Playgroud)

请注意,即使使用private(和fileprivate)符号也不可用@testable.


Swift 1.x

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

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

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

PrimeNumberModelTests.swift

import XCTest
import MyProject

class PrimeNumberModelTests: XCTestCase {
    let testObject = PrimeNumberModel()
}
Run Code Online (Sandbox Code Playgroud)

但是,这是不够的,测试类PrimeNumberModel,因为默认访问控制水平Internal Access,你的类不会对测试束可见的,所以你需要使它Public Access和所有要测试的方法:

PrimeNumberModel.swift

import Foundation

public class PrimeNumberModel {
   public init() {
   }
}
Run Code Online (Sandbox Code Playgroud)


Nit*_*hel 46

它在文档中说Swift中没有import语句.

在此输入图像描述

只需使用:

let primNumber = PrimeNumberModel()
Run Code Online (Sandbox Code Playgroud)

  • 由于某种原因,这对我不起作用. (11认同)
  • 这工作但我必须关闭并重新打开Xcode 6.0才能最终显示出来.尝试清理和构建项目. (2认同)

小智 34

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

  • 这个人不能,他需要9个以上的代表(在撰写本文时). (8认同)

Fom*_*tia 17

在Objective-C中,如果你想在另一个文件中使用一个类,你必须导入它:

#import "SomeClass.h"
Run Code Online (Sandbox Code Playgroud)

但是,在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()
}
Run Code Online (Sandbox Code Playgroud)

如您所见,不需要导入.希望这可以帮助.


Ale*_*lds 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.
    }
}

}
Run Code Online (Sandbox Code Playgroud)

因此,请确保PrimeNumberModel具有测试目标的目标.或High6导入整个模块的解决方案将起作用


小智 5

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

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


Geo*_* WS 5

从 Swift 2.0 开始,最佳实践是:

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

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