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

如何从另一个Swift文件导入Swift文件?,swift,xcode6,Swift,Xcode6,我只是想包括来自另一个文件的Swift类,比如它的测试 PrimeNumberModel.swift import Foundation class PrimeNumberModel { } import XCTest import PrimeNumberModel // gives me "No such module 'PrimeNumberModel'" class PrimeNumberModelTests: XCTestCase { let testObject = P

我只是想包括来自另一个文件的Swift类,比如它的测试

PrimeNumberModel.swift

import Foundation

class PrimeNumberModel { }
import XCTest
import PrimeNumberModel  // gives me "No such module 'PrimeNumberModel'"

class PrimeNumberModelTests: XCTestCase {
    let testObject = PrimeNumberModel()  // "Use of unresolved identifier 'PrimeNumberModel'"    
}
import XCTest
@testable import MyProject

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

class PrimeNumberModel {
   init() {
   }
}
import XCTest
import MyProject

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

public class PrimeNumberModel {
   public init() {
   }
}
PrimeNumberModelTests()
PrimeNumberModelTests.swift

import Foundation

class PrimeNumberModel { }
import XCTest
import PrimeNumberModel  // gives me "No such module 'PrimeNumberModel'"

class PrimeNumberModelTests: XCTestCase {
    let testObject = PrimeNumberModel()  // "Use of unresolved identifier 'PrimeNumberModel'"    
}
import XCTest
@testable import MyProject

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

class PrimeNumberModel {
   init() {
   }
}
import XCTest
import MyProject

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

public class PrimeNumberModel {
   public init() {
   }
}
PrimeNumberModelTests()
两个swift文件都在同一个目录中。

在中,它表示swift中没有导入语句

只需使用:

let primNumber = PrimeNumberModel()

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

要摆脱这个问题,请执行以下操作:

使用未解析的标识符“PrimeNumberModel”


我需要导入测试文件中的基本模块。在我的例子中,我的目标被称为“myproject”,我添加了
导入myproject
,该类被识别。

根据苹果公司的说法,在同一目标中不需要导入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解决方案将起作用

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

检查
PrimeNumberModelTests
目标设置


如果在构建阶段/编译源代码中看不到
PrimeNumberModel.swift
文件,请添加它。

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

#import "SomeClass.h"
然而,在Swift中,您根本不需要导入。只需像已经导入一样使用它

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

更新Swift 2.x、3.x、4.x和5.x 现在,您不需要将
public
添加到要测试的方法中。 在较新版本的Swift上,只需添加关键字

PrimeNumberModelTests.swift

import Foundation

class PrimeNumberModel { }
import XCTest
import PrimeNumberModel  // gives me "No such module 'PrimeNumberModel'"

class PrimeNumberModelTests: XCTestCase {
    let testObject = PrimeNumberModel()  // "Use of unresolved identifier 'PrimeNumberModel'"    
}
import XCTest
@testable import MyProject

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

class PrimeNumberModel {
   init() {
   }
}
import XCTest
import MyProject

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

public class PrimeNumberModel {
   public init() {
   }
}
PrimeNumberModelTests()
您的内部方法可以保持
内部

PrimeNumberModel.swift

import Foundation

class PrimeNumberModel { }
import XCTest
import PrimeNumberModel  // gives me "No such module 'PrimeNumberModel'"

class PrimeNumberModelTests: XCTestCase {
    let testObject = PrimeNumberModel()  // "Use of unresolved identifier 'PrimeNumberModel'"    
}
import XCTest
@testable import MyProject

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

class PrimeNumberModel {
   init() {
   }
}
import XCTest
import MyProject

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

public class PrimeNumberModel {
   public init() {
   }
}
PrimeNumberModelTests()
请注意,
private
(和
fileprivate
)符号即使使用
@testable
也不可用


Swift 1.x 这里有两个来自Swift的相关概念(如Xcode 6 beta 6)

  • 您不需要导入Swift类,但需要导入外部模块(目标)
  • Swift中的默认级别为
    内部访问
  • 考虑到测试是在
    PrimeNumberModelTests上的另一个目标上进行的。swift
    您需要
    导入包含要测试的类的目标,如果您的目标被称为
    MyProject
    ,则需要将
    导入MyProject
    添加到
    PrimeNumberModelTests

    PrimeNumberModelTests.swift

    import Foundation
    
    class PrimeNumberModel { }
    
    import XCTest
    import PrimeNumberModel  // gives me "No such module 'PrimeNumberModel'"
    
    class PrimeNumberModelTests: XCTestCase {
        let testObject = PrimeNumberModel()  // "Use of unresolved identifier 'PrimeNumberModel'"    
    }
    
    import XCTest
    @testable import MyProject
    
    class PrimeNumberModelTests: XCTestCase {
        let testObject = PrimeNumberModel()
    }
    
    import Foundation
    
    class PrimeNumberModel {
       init() {
       }
    }
    
    import XCTest
    import MyProject
    
    class PrimeNumberModelTests: XCTestCase {
        let testObject = PrimeNumberModel()
    }
    
    import Foundation
    
    public class PrimeNumberModel {
       public init() {
       }
    }
    
    PrimeNumberModelTests()
    
    但这还不足以测试类
    PrimeNumberModel
    ,因为默认的访问控制级别是
    Internal Access
    ,您的类对测试包不可见,所以您需要将其设置为
    Public Access
    以及所有要测试的方法:

    PrimeNumberModel.swift

    import Foundation
    
    class PrimeNumberModel { }
    
    import XCTest
    import PrimeNumberModel  // gives me "No such module 'PrimeNumberModel'"
    
    class PrimeNumberModelTests: XCTestCase {
        let testObject = PrimeNumberModel()  // "Use of unresolved identifier 'PrimeNumberModel'"    
    }
    
    import XCTest
    @testable import MyProject
    
    class PrimeNumberModelTests: XCTestCase {
        let testObject = PrimeNumberModel()
    }
    
    import Foundation
    
    class PrimeNumberModel {
       init() {
       }
    }
    
    import XCTest
    import MyProject
    
    class PrimeNumberModelTests: XCTestCase {
        let testObject = PrimeNumberModel()
    }
    
    import Foundation
    
    public class PrimeNumberModel {
       public init() {
       }
    }
    
    PrimeNumberModelTests()
    
    所以,你需要

  • 导入要使用的外部模块
  • 并确保对要使用的类和方法具有正确的访问修饰符
  • 在我的例子中,我有一个swift文件,我想进行单元测试,单元测试文件也是一个swift类。我确保访问修饰符是正确的,但是

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

    仍然不起作用(我仍然收到“没有这样的模块”错误),我检查了我的目标,它的名字确实是stMobile。所以,我去了Build Settings,在packaging下找到了产品模块名,出于某种原因,这个名为St_Mobile,所以我更改了导入声明

    import stMobile
    
    import St_Mobile
    
    (这是产品模块名
    ),一切正常

    总而言之:

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

    import myProductModuleName
    
  • 确保访问修饰符正确(类级别和方法)


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


    Xcode可以为您构建swift模块,或者参考
    swiftc

    的命令行说明,正如@high6和@erik-p-hansen在@high6给出的答案中指出的,这可以通过导入PrimeNumberModel类所在模块的目标来克服,它可能与简单项目中的项目同名


    在看这篇文章时,我在swiftcast.tv上看到了Clayton McIllath的文章。它讨论了访问修饰符,显示了您遇到的同一问题的示例(但对于ViewController而不是模型文件),并显示了如何导入目标并通过在目标中包含目标文件来解决访问修饰符问题,这意味着您不必将要测试的类公开,除非您确实想这样做。

    我可以通过清理构建来解决这个问题

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

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

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


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

    您需要为编译器添加一个例程,作为条目p引用