Как импортировать файл Swift из другого файла Swift?

Я просто хочу включить мой класс 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'"    
}

Оба быстрых файла находятся в одном каталоге.

Ответ 1

У меня была та же проблема, также в моих XCTestCase файлах, но не в обычных файлах проекта.

Чтобы избавиться от:

Использование неразрешенного идентификатора 'PrimeNumberModel'

Мне нужен import базовый модуль в тестовом файле. В моем случае моя цель называется "myproject", и я добавил import myproject, и класс был распознан.

Ответ 2

ОБНОВЛЕНИЕ Swift 2.x, 3.x, 4.x и 5.x

Теперь вам не нужно добавлять public методы для тестирования. В новых версиях Swift необходимо только добавить ключевое слово @testable.

PrimeNumberModelTests.swift

import XCTest
@testable import MyProject

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

И ваши внутренние методы могут сохранить Internal

PrimeNumberModel.swift

import Foundation

class PrimeNumberModel {
   init() {
   }
}

Обратите внимание, что privatefileprivate) символы недоступны даже при использовании @testable.


Swift 1.x

Здесь есть две соответствующие концепции от Swift (как Xcode 6 beta 6).

  1. Вам не нужно импортировать классы Swift, но вам нужно импортировать внешние модули (цели)
  2. Уровень контроля доступа по умолчанию в Swift - Internal access

Учитывая, что тесты выполняются для другой цели в PrimeNumberModelTests.swift вам необходимо import цель, содержащую класс, который вы хотите проверить, если ваша цель называется MyProject, необходимо добавить import MyProject PrimeNumberModelTests в PrimeNumberModelTests:

PrimeNumberModelTests.swift

import XCTest
import MyProject

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

Но этого недостаточно для тестирования вашего класса PrimeNumberModel, поскольку уровень контроля доступа по умолчанию - Internal Access, ваш класс не будет виден тестовому комплекту, поэтому вам нужно сделать его Public Access и всеми методами, которые вы хотите протестировать.:

PrimeNumberModel.swift

import Foundation

public class PrimeNumberModel {
   public init() {
   }
}

Ответ 3

В документации сказано, что в Swift нет операторов импорта.

enter image description here

Просто используйте:

let primNumber = PrimeNumberModel()

Ответ 4

Проверьте целевое членство в PrimeNumberModel.swift в целевой точке тестирования.

Ответ 5

В 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()
}

Как вы можете видеть, импорт не требуется. Надеюсь, это поможет.

Ответ 6

Согласно Apple, вам не нужен импорт для быстрых файлов в одной и той же цели. Я, наконец, получил его работу, добавив мой быстрый файл как к моей обычной цели, так и к тестовой цели. Затем я использовал заголовок заголовка для теста, чтобы убедиться, что мои файлы 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.
    }
}

}

SO убедитесь, что у PrimeNumberModel есть цель вашего тестового объекта. Или High6 решение по импорту всего вашего модуля будет работать

Ответ 7

Мне удалось решить эту проблему, очистив мою сборку.

Главное меню → Продукт → Очистить Или сочетание клавиш: Shift + Cmd + K

Ответ 8

С Swift 2.0 лучшая практика:

Добавьте строку @testable import MyApp в начало тестового файла, где "MyApp" - это Имя модуля продукта вашего целевого приложения (доступно для просмотра в целевом приложении строить настройки). Что это.

(Обратите внимание, что имя модуля продукта будет таким же, как ваше целевое имя приложения, если ваше целевое имя приложения не содержит пробелов, которое будет заменено символом подчеркивания. Например, если моя целевая программа была названа "Fun Game", я бы напишите @testable import Fun_Game в верхней части моих тестов.)

Ответ 9

Проверьте целевые настройки PrimeNumberModelTests.

Если вы не видите файл PrimeNumberModel.swift в Build Phases/Compile Sources, добавьте его.

Ответ 10

Вам нужно добавить подпрограмму компилятора для ссылки в качестве точки входа, поэтому добавьте файл 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.

Ответ 11

Итак, вам нужно

  • Импорт внешних модулей, которые вы хотите использовать
  • И убедитесь, что у вас есть подходящие модификаторы доступа к классу и методам, которые вы хотите использовать.

В моем случае у меня был быстрый файл, который я хотел unit test, а файл unit test также был быстрым. Я убедился, что модификаторы доступа верны, но оператор

import stMobile

(скажем, что stMobile - это наше целевое имя)

все еще не работал (я все еще получал ошибку "Нет такого модуля" ), я проверил свою цель, и ее имя действительно было stMobile. Итак, я пошел в "Настройки сборки" под упаковкой и нашел имя модуля продукта, и по какой-то причине это было вызвано St_Mobile, поэтому я изменил оператор импорта

import St_Mobile

(который является Имя модуля продукта), и все сработало.

Итак, подведем итог:

  • Проверьте имя модуля продукта и используйте оператор импорта ниже в unit test class

    import myProductModuleName
    
  • Убедитесь, что ваши модификаторы доступа верны (уровень класса и ваши методы).

Ответ 12

Вместо требуемого явного импорта компилятор Swift неявно ищет файлы .swiftmodule зависимых библиотек Swift.

Xcode может создавать быстрые модули для вас или ссылаться на блог railsware для команд командной строки для swiftc.

Ответ 13

Как отмечалось в @high6 и @erik-p-hansen в ответе @high6, это можно преодолеть, импортировав цель для модуля, где находится класс PrimeNumberModel, который, вероятно, совпадает с именем вашего проекта в простой проект.

Посмотрев на это, я наткнулся на статью Напишите свой первый Unit Test в Swift в swiftcast.tv от Clayton McIlrath. Он обсуждает модификаторы доступа, показывает пример той же проблемы, что у вас есть (но для ViewController, а не файла модели) и показывает, как и импортировать цель, и решать проблему модификатора доступа, включая целевой файл в целевой, что означает вам не нужно делать класс, который вы пытаетесь опробовать общественность, если вы на самом деле этого не хотите.

Ответ 14

У меня была такая же проблема с одним конкретным файлом (в XCode 6.3). Он работал для всех других файлов, но один файл застрял в статусе управления версиями, отображаемом как "A +" (после переименования), и класс внутри этого файла не будет идентифицироваться другими файлами. Итак, я знал, что ошибка НЕ ​​НЕ из-за отсутствия инструкции import.

Это исправление работало для меня:

  • Резервное копирование содержимого файла в отдельный файл
  • Удален файл, вызывающий проблемы из проекта XCode
  • Добавлен новый быстрый проект в проект
  • Скопировано содержимое из резервной копии файла в новый файл.