160 votes

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

Je veux simplement inclure ma classe Swift depuis 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.

1 votes

2 votes

Selon la documentation d'Apple, vous n'avez pas besoin d'une importation lorsque les deux fichiers ont la même cible. Malheureusement, les tests ont une cible différente. Une solution possible serait de faire une déclaration d'importation en utilisant votreModule/PrimeNumberModel.

0 votes

@joseph.hainline Je suis confronté au même problème. Comment le résoudre ? Je suis coincé maintenant.

133voto

High6 Points 2434

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

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, mon cible s'appelle 'myproject' et j'ai ajouté import myproject et la classe a été reconnue.

1 votes

Oui, c'est comme ça qu'il faut faire. Sauf que je pense que ce n'est pas vraiment votre projet que vous importez, mais plutôt la cible contenant le code que vous voulez tester ?

1 votes

Merci mec, ça m'a fait gagner beaucoup de temps. Vous devez import <TARGET> .

2 votes

Il faut plus de votes positifs. Les réponses qui conseillent d'ajouter simplement le fichier .swift à la cible de test ne sont pas exactement fausses, mais ce n'est pas la façon dont il faut procéder.

71voto

Diogo Tridapalli Points 654

MISE À JOUR de Swift 2.x, 3.x, 4.x et 5.x

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

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 private (et fileprivate ) ne sont pas disponibles, même en utilisant les symboles @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 défaut Contrôle d'accès en 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 voulez tester, si votre cible s'appelle MyProject devra ajouter import MyProject à la PrimeNumberModelTests :

PrimeNumberModelTests.swift

import XCTest
import MyProject

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

Mais ce n'est pas suffisant 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 pour le paquet de test, donc vous devez la rendre Public Access et toutes les méthodes que vous voulez tester :

PrimeNumberModel.swift

import Foundation

public class PrimeNumberModel {
   public init() {
   }
}

0 votes

Y a-t-il un moyen de modifier le contrôle d'accès par défaut ? J'ai eu un cas bizarre où il fonctionnait très bien sans le modificateur public, puis j'ai déplacé les cas de test, et soudain, ça n'a plus fonctionné.

0 votes

Je pense que ce n'est pas possible, du moins pour la version actuelle de swift.

0 votes

Merci. Et j'ai découvert que mon problème était que le fichier swift n'est pas construit vers la cible de test avec les cas de test.

51voto

Nitin Gohel Points 19461

Dans le Documentation il est dit qu'il n'y a pas de déclaration d'importation dans Swift.

enter image description here

Il suffit d'utiliser :

let primNumber = PrimeNumberModel()

2 votes

Cela a fonctionné mais j'ai dû fermer et rouvrir Xcode 6.0 pour que la classe apparaisse enfin. Essayez également de nettoyer et de construire le projet.

0 votes

Cela semble être une nouveauté (ou un problème) dans la dernière version bêta de XCode 6.3, de sorte que l'instruction d'importation est maintenant nécessaire. Il existe également une instruction import dans Swift, pour importer des modules.

0 votes

Selon la documentation fournie, ce tableau avec "No import statement" est lié au cas "Import from the same target". Dans le cas de XCTests vous utilisez une cible (de test) différente, donc observez la section "Importation de frameworks externes" de l'article, il y a un autre tableau : N'importe quel framework de langage -> Importation dans Swift -> import "FrameworkName" est nécessaire.

35voto

kimkkikki Points 111

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

1 votes

Veuillez ajouter ceci comme commentaire.

9 votes

Cette personne ne peut pas, elle a besoin de 9 représentants supplémentaires pour le faire (au moment de la rédaction).

1 votes

Que diable est une cible ?

19voto

Coder Points 31

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

#import "SomeClass.h"

Cependant, en Swift, vous n'avez pas besoin d'importer du tout. Il suffit de l'utiliser 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'a été nécessaire. J'espère que cela vous aidera.

0 votes

Merci ! Je suis encore en train de me familiariser avec toutes ces nouvelles fonctionnalités de Swift.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X