taylor - ¿Cómo importo un archivo Swift de otro archivo Swift?
taylor swift singles reputation (13)
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.
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).
- No necesita importar clases Swift, pero necesita importar módulos externos (objetivos)
- El nivel de Control de acceso predeterminado en Swift es
Internal access
Teniendo en cuenta que las pruebas están en otro objetivo en PrimeNumberModelTests.swift
, necesita import
el destino que contiene la clase que desea probar; si su objetivo 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() {
}
}
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 objetivo de su aplicación (visible en la configuración de compilació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 objetivo de mi aplicación se llamara "Juego divertido", escribiría @testable import Fun_Game
en la parte superior de mis pruebas).
Como @ high6 y @ erik-p-hansen señalaron en la respuesta dada por @ high6, esto puede superarse importando el objetivo 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 objetivo 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.
Debe agregar una rutina para que el compilador 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 compila 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 programa se compila y es ejecutable:
./PrimeNumberMain
CAVEAT: eliminé el tipo de importación XCTest y XCTestCase por simplicidad.
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.
En la Documentation dice que no hay declaraciones de importación en Swift.
Simplemente use:
let primNumber = PrimeNumberModel()
En lugar de requerir importaciones explícitas, el compilador 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
.
Entonces, necesitas
- Importar módulos externos que quieras usar
- 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 compilació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 declaración de importación
import St_Mobile
(que es el nombre del módulo del producto ), y todo funcionó.
Así que para resumir:
Verifique el nombre de su módulo de producto y utilice la declaración de importación a continuación en su clase de prueba de unidad
import myProductModuleName
Asegúrate de que tus modificadores de acceso sean correctos (nivel de clase y tus métodos).
Pude resolver este problema limpiando mi construcción.
Menú superior -> Producto -> Limpiar o atajo de teclado: Shift + Cmd + K
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 objetivo habitual como a mi objetivo 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 objetivo de prueba. O la solución High6 de importar todo tu módulo funcionará
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 objetivo se llama ''myproject'' y agregué import myproject
y la clase fue reconocida.
Verifique la PrimeNumberModelTests
objetivos de PrimeNumberModelTests
.
Si no puede ver el archivo PrimeNumberModel.swift
en Build Phases/Compile Sources
, agréguelo.
Verifique la membresía objetivo de PrimeNumberModel.swift en su objetivo de prueba.