¿Cómo importo un archivo Swift de otro archivo Swift?

Simplemente quiero incluir mi clase Swift de otro archivo, como su prueba

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'" } 

Ambos archivos rápidos están en el mismo directorio.

Tuve el mismo problema, también en mis archivos XCTestCase , pero no en los archivos regulares del proyecto.

Para deshacerse de:

Uso del identificador no resuelto ‘PrimeNumberModel’

Necesitaba import el módulo base en el archivo de prueba. En mi caso, mi objective se llama ‘myproject’ y agregué import myproject y la clase fue reconocida.

ACTUALIZA Swift 2.x y 3.x

Ahora no necesita agregar el public a los métodos para probarlos. En Swift 2 solo es necesario agregar la palabra clave @testable .

PrimeNumberModelTests.swift

 import XCTest @testable import MyProject class PrimeNumberModelTests: XCTestCase { let testObject = PrimeNumberModel() } 

Y sus métodos internos pueden mantener Internal

PrimeNumberModel.swift

 import Foundation class PrimeNumberModel { init() { } } 

Tenga en cuenta que private símbolos private (y fileprivate ) no están disponibles incluso con @testable .


Swift 1.x

Aquí hay dos conceptos relevantes de Swift (como Xcode 6 beta 6).

  1. No necesita importar clases Swift, pero necesita importar módulos externos (objectives)
  2. El nivel de Control de acceso predeterminado en Swift es Internal access

Teniendo en cuenta que las pruebas están en otro objective en PrimeNumberModelTests.swift , necesita import el destino que contiene la clase que desea probar; si su objective se llama, MyProject deberá agregar import MyProject a PrimeNumberModelTests :

PrimeNumberModelTests.swift

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

Pero esto no es suficiente para probar su clase PrimeNumberModel , ya que el nivel predeterminado de Control de acceso es Internal Access , su clase no estará visible para el paquete de prueba, por lo que debe hacer que sea Public Access y todos los métodos que desee probar :

PrimeNumberModel.swift

 import Foundation public class PrimeNumberModel { public init() { } } 

En la Documentación dice que no hay declaraciones de importación en Swift.

enter image description here

Simplemente use:

 let primNumber = PrimeNumberModel() 

Verifique la membresía objective de PrimeNumberModel.swift en su objective de prueba.

En Objective-C, si quería usar una clase en otro archivo, tenía que importarlo:

 #import "SomeClass.h" 

Sin embargo, en Swift, no tiene que importar nada. Simplemente utilícelo como si ya hubiera sido importado.

Ejemplo

 // This is a file named SomeClass.swift class SomeClass : NSObject { } // This is a different file, named OtherClass.swift class OtherClass : NSObject { let object = SomeClass() } 

Como puede ver, no se necesitó importar. Espero que esto ayude.

Según Apple, no necesita importar archivos rápidos en el mismo destino. Finalmente lo conseguí trabajando agregando mi archivo rápido tanto a mi objective habitual como a mi objective de prueba. Luego utilicé el encabezado de puente para la prueba para asegurarme de que mis archivos ObjC a los que hice referencia en mi encabezado de bridging regular estuvieran disponibles. Corría como un encanto ahora.

 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. } } } 

ASÍ QUE asegúrese de que PrimeNumberModel tenga un objective de prueba. O la solución High6 de importar todo tu módulo funcionará

Pude resolver este problema limpiando mi construcción.

Menú superior -> Producto -> Limpiar o atajo de teclado: Shift + Cmd + K

A partir de Swift 2.0, la mejor práctica es:

Agregue la línea @testable import MyApp a la parte superior de su archivo de prueba, donde “MyApp” es el nombre del módulo de producto del objective de su aplicación (visible en la configuración de comstackción de su aplicación ). Eso es.

(Tenga en cuenta que el nombre del módulo de producto será el mismo que el nombre de su aplicación, a menos que el nombre de su aplicación contenga espacios, que serán reemplazados por guiones bajos. Por ejemplo, si el objective de mi aplicación se llamara “Juego divertido”, escribiría @testable import Fun_Game en la parte superior de mis pruebas).

Debe agregar una rutina para que el comstackdor haga referencia como punto de entrada, por lo tanto, agregue un archivo main.swift, que en este caso simplemente crea una instancia de su archivo de prueba:

main.swift

 PrimeNumberModelTests() 

Luego comstack en la línea de comando (estoy usando El Capitan y Swift 2.2):

 xcrun -sdk macosx swiftc -emit-executable -o PrimeNumberMain PrimeNumberModel.swift PrimeNumberModelTests.swift main.swift 

En este caso, recibirá una advertencia: el resultado del inicializador no se utiliza , pero el progtwig se comstack y es ejecutable:

 ./PrimeNumberMain 

CAVEAT: eliminé el tipo de importación XCTest y XCTestCase por simplicidad.

Verifique la PrimeNumberModelTests objectives de PrimeNumberModelTests .

Si no puede ver el archivo PrimeNumberModel.swift en Build Phases/Compile Sources , agréguelo.

Entonces, necesitas

  1. Importar módulos externos que quieras usar
  2. Y asegúrese de tener los modificadores de acceso correctos en la clase y los métodos que quiera usar.

En mi caso, tenía un archivo rápido que quería probar en una unidad, y el archivo de prueba de la unidad también era una clase rápida. Me aseguré de que los modificadores de acceso fueran correctos, pero la afirmación

 import stMobile 

(digamos que stMobile es nuestro nombre de destino)

todavía no funcionaba (todavía recibía el error ‘No such module’), revisé mi destino, y su nombre era stMobile. Entonces, fui a Configuraciones de comstackción, debajo del paquete, y encontré el Nombre del módulo del producto, y por alguna razón esto se llamó St_Mobile, así que cambié mi statement de importación

 import St_Mobile 

(que es el nombre del módulo del producto ), y todo funcionó.

Así que para resumir:

  1. Verifique el nombre de su módulo de producto y utilice la statement de importación a continuación en su clase de prueba de unidad

     import myProductModuleName 
  2. Asegúrate de que tus modificadores de acceso sean correctos (nivel de clase y tus métodos).

En lugar de requerir importaciones explícitas, el comstackdor Swift busca implícitamente archivos .swiftmodule de bibliotecas Swift de dependencia.

Xcode puede construir módulos rápidos para usted, o consulte el blog railsware para obtener instrucciones de línea de comando para swiftc .

Como @ high6 y @ erik-p-hansen señalaron en la respuesta dada por @ high6, esto puede superarse importando el objective para el módulo donde está la clase PrimeNumberModel, que probablemente sea el mismo nombre que su proyecto en un proyecto simple .

Mientras miraba esto, me encontré con el artículo Escriba su primera prueba de unidad en Swift en swiftcast.tv por Clayton McIlrath. Discute los modificadores de acceso, muestra un ejemplo del mismo problema que tienes (pero para un ViewController en lugar de un archivo modelo) y muestra cómo importar el objective y resolver el problema del modificador de acceso incluyendo el archivo de destino en el destino, lo que significa no es necesario que haga pública la clase que está tratando de poner a prueba, a menos que realmente quiera hacerlo.