web-dev-qa-db-fra.com

Comment importer un fichier Swift à partir d'un autre fichier Swift?

Je veux simplement inclure ma classe Swift d'un autre fichier, comme son test

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

Les deux fichiers Swift se trouvent dans le même répertoire.

142
joseph.hainline

J'ai eu le même problème, également dans mes fichiers XCTestCase, mais pas dans les fichiers de projet standard.

Pour se débarrasser du:

Utilisation de l'identifiant non résolu 'PrimeNumberModel'

J'avais besoin de import le module de base dans le fichier de test. Dans mon cas, ma cible s'appelle 'mon projet' et j'ai ajouté import myproject et la classe a été reconnue.

128
H6.

UPDATE Swift 2.x, 3.x, 4.x et 5.x

Maintenant, vous n'avez pas besoin d'ajouter le public aux méthodes à tester. Sur les versions plus récentes de Swift, il suffit d'ajouter le mot clé @testable .

PrimeNumberModelTests.Swift

_import XCTest
@testable import MyProject

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

Et vos méthodes internes peuvent garder Internal

PrimeNumberModel.Swift

_import Foundation

class PrimeNumberModel {
   init() {
   }
}
_

Notez que les symboles private (et fileprivate) ne sont pas disponibles, même si vous utilisez _@testable_.


Swift 1.x

Il y a deux concepts pertinents de Swift ici (comme Xcode 6 beta 6).

  1. Vous n'avez pas besoin d'importer des classes Swift, mais vous devez importer des modules externes (cibles)
  2. Le niveau par défaut Contrôle d'accès dans Swift est _Internal access_

Considérant que les tests sont sur une autre cible sur _PrimeNumberModelTests.Swift_, vous devez import la cible qui contient la classe que vous souhaitez tester, si votre cible est appelé MyProject devra ajouter _import MyProject_ à la PrimeNumberModelTests:

PrimeNumberModelTests.Swift

_import XCTest
import MyProject

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

Mais cela ne suffit pas pour tester votre classe PrimeNumberModel, puisque le niveau de contrôle d'accès par défaut est _Internal Access_, votre classe ne sera pas visible par le test bundle, vous devez donc le rendre _Public Access_ et toutes les méthodes que vous souhaitez tester:

PrimeNumberModel.Swift

_import Foundation

public class PrimeNumberModel {
   public init() {
   }
}
_
67
Diogo T

Dans le Documentation , il est indiqué qu'il n'y a pas d'instructions d'importation dans Swift.

enter image description here

Utilisez simplement:

let primNumber = PrimeNumberModel()
46
Nitin Gohel

Vérifiez l'appartenance à la cible de PrimeNumberModel.Swift dans votre cible de test.

33
kimkkikki

En Objective-C, si vous voulez utiliser une classe dans un autre fichier, vous devez l'importer:

#import "SomeClass.h"

Cependant, dans Swift, vous n'avez pas du tout à importer. Utilisez-le simplement comme s'il était déjà importé.

Exemple

// This is a file named SomeClass.Swift

class SomeClass : NSObject {

}

// This is a different file, named OtherClass.Swift

class OtherClass : NSObject {
    let object = SomeClass()
}

Comme vous pouvez le constater, aucune importation n’était nécessaire. J'espère que cela t'aides.

17
Fomentia

Selon Apple, vous n'avez pas besoin d'importer les Swift fichiers de la même cible. Je l'ai enfin fait fonctionner en ajoutant mon fichier Swift à la fois à ma cible normale et à ma cible de test. Ensuite, j'ai utilisé l'en-tête de pontage à des fins de test pour vérifier que les fichiers ObjC que j'ai référencés dans mon en-tête de pontage normal étaient disponibles. A couru comme un charme maintenant.

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 Assurez-vous donc que PrimeNumberModel a une cible de votre cible de test. Ou la solution High6 d'importer tout votre module fonctionnera

5
Alex Reynolds

J'ai pu résoudre ce problème en nettoyant mon build.

Menu supérieur -> Produit -> Nettoyer ou raccourci clavier: Shift+Cmd+K

5
Peter Fisher

À partir de Swift 2.0, la meilleure pratique est la suivante:

Ajoutez la ligne @testable import MyApp en haut de votre fichier de test, où "MonApp" est le Nom du module de produit de votre cible d'application (visible dans votre cible d'application build paramètres). C'est ça.

(Notez que le nom du module du produit sera identique à celui de la cible de votre application, à moins que le nom de celle-ci ne contienne des espaces qui seront remplacés par des traits de soulignement. Par exemple, si ma cible d'application était appelée " Jeu amusant "J'écrirais @testable import Fun_Game en haut de mes tests.)

4
George WS

Vérifiez vos paramètres PrimeNumberModelTests Target.

Si vous ne pouvez pas voir le fichier PrimeNumberModel.Swift dans la construction Phases/Compile Sources, ajoutez-le.

1
Bumseok

Vous devez ajouter une routine que le compilateur doit référencer en tant que point d’entrée. Ajoutez donc un fichier main.Swift, qui dans ce cas crée simplement une instance de votre fichier de test:

main.Swift

PrimeNumberModelTests()

Puis compilez sur la ligne de commande (j'utilise El Capitan et Swift 2.2):

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

Dans ce cas, vous recevrez un avertissement: le résultat de l'initialiseur n'est pas utilisé , mais le programme est compilé et est exécutable:

./PrimeNumberMain

CAVEAT: J'ai supprimé les types d'importation XCTest et XCTestCase pour plus de simplicité.

1
Pinecone

Comme @ high6 et @ erik-p-hansen l'ont souligné dans la réponse donnée par @ high6, vous pouvez résoudre ce problème en important la cible du module contenant la classe PrimeNumberModel, qui porte probablement le même nom que votre projet dans un projet simple. .

En regardant cela, je suis tombé sur l'article écrivez votre premier test unitaire à Swift sur swiftcast.tv de Clayton McIlrath. Il aborde les modificateurs d’accès, montre un exemple du même problème que vous rencontrez (mais pour un ViewController plutôt qu’un fichier de modèle) et montre comment importer le cible et résoudre le problème du modificateur d’accès en incluant le fichier de destination dans la cible, ce qui signifie vous n'êtes pas obligé de rendre public le cours que vous essayez de tester, sauf si vous le souhaitez réellement.

0
mr_sd

Donc, vous devez

  1. Importer les modules externes que vous souhaitez utiliser
  2. Et assurez-vous que vous avez les bons modificateurs d'accès sur la classe et les méthodes que vous souhaitez utiliser.

Dans mon cas, j’avais un fichier Swift que je souhaitais tester, et le fichier de test unitaire était également une classe Swift. Je me suis assuré que les modificateurs d'accès étaient corrects, mais la déclaration

import stMobile

(disons que stMobile est notre nom cible)

ne fonctionnait toujours pas (j'avais toujours l'erreur "Aucun module de ce type"), j'ai vérifié ma cible et son nom était bien stMobile. Alors, je suis allé à Build Settings, sous packaging, et j'ai trouvé le nom du module de produit, et pour une raison quelconque, cela s'appelait St_Mobile. J'ai donc changé mon instruction d'importation.

import St_Mobile

(qui est le Nom du module du produit), et tout a fonctionné.

Pour résumer:

  1. Vérifiez votre nom de module de produit et utilisez la déclaration d'importation ci-dessous dans votre classe de test unitaire.

    import myProductModuleName
    
  2. Assurez-vous que vos modificateurs d'accès sont corrects (niveau de classe et vos méthodes).

0
Cloud9999Strife

Au lieu de requérir des importations explicites, le compilateur Swift recherche implicitement les fichiers .swiftmodule des dépendances Swift.

Xcode peut créer des modules Swift pour vous ou vous référer au blog de railsware pour obtenir des instructions en ligne de commande pour swiftc.

0
mcandre