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

163

我想从另一个文件中引用我的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 文件在同一个目录中。


2
根据苹果文档,当两个文件具有相同的目标时,您不需要导入。不幸的是,测试具有不同的目标。一种可能的解决方案是使用“yourModule/PrimeNumberModel”进行导入语句。 - Alex Reynolds
@joseph.hainline 我也遇到了同样的问题。这个问题怎么解决呢?我现在卡住了。 - Developer
13个回答

1

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

Xcode可以为您构建Swift模块,或者参考railsware博客中的命令行说明使用swiftc


1

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

在查看此内容时,我遇到了Clayton McIlrath在swiftcast.tv上发布的文章使用Swift编写第一个单元测试。它讨论了访问修饰符,展示了与您遇到的相同问题的示例(但针对的是ViewController而不是模型文件),并展示了如何导入目标并通过将目标文件包含在其中解决访问修饰符问题,这意味着您无需使要测试的类公开,除非您确实想这样做。


1

所以,您需要:

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

在我的情况下,我想单元测试一个 Swift 文件,而单元测试文件也是一个 Swift 类。我确保访问修饰符是正确的,但语句

import stMobile

假设我们的目标名称是stMobile。

仍然没有起作用(我仍然收到“没有这样的模块”错误),我检查了我的目标,它的名称确实是stMobile。因此,我进入构建设置,在打包下找到产品模块名称,发现它被称为St_Mobile,所以我改变了我的导入语句。

import St_Mobile

(这是产品模块名称),一切都正常工作。
因此,总结一下:
  1. 检查您的产品模块名称,并在您的单元测试类中使用以下导入语句:

    import myProductModuleName
    
  2. 确保您的访问修饰符正确(类级别和您的方法)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接