web-dev-qa-db-fra.com

"Utilisation de type non déclaré" dans Swift, même si le type est interne et existe dans le même module

J'ai un type dans mon module:

import Cocoa

class ColoredDotView : NSView {
   ...
}

Il est utilisé dans un certain nombre de classes différentes sans problème:

class EditSubjectPopoverController : NSObject {

    @IBOutlet internal var subjectColorDotView : ColoredDotView!
    ...
}

Mais pour quelque raison, lorsque je l'utilise dans une classe {spécifique} _, j'ai des erreurs de compilation sur le type:

class EditTaskPopoverController : NSObject {

    @IBOutlet internal var lowPriorityDotView : ColoredDotView! // Error here
    @IBOutlet internal var medPriorityDotView : ColoredDotView! // And here...
    @IBOutlet internal var highPriorityDotView : ColoredDotView! // And here...
    ...
}

L'erreur de compilation est:

EditTaskPopoverController.Swift: 15: 49: Utilisation de type non déclaré 'ColoredDotView'

Ce que je ne comprends pas C'est la première erreur de compilation dans le fichier, et le reste des erreurs est symptomatique de la première. De plus, il y a pas d'autres fichiers avec des erreurs de compilation. Je ne comprends pas pourquoi le type est non déclaré, car le fichier est dans le même module:

enter image description here

J'ai essayé de nettoyer le projet, de nettoyer le dossier de construction et de redémarrer Xcode, en vain. Quelles erreurs potentielles peuvent provoquer une erreur de compilation undeclared type dans Swift?

136
Craig Otis

Ouf, finalement diagnostiqué cela. D'une manière ou d'une autre , le fichier Swift EditTaskPopoverController.Swift incriminé était dans deux phases de construction différentes.

C'était correctement dans Compile Sources, avec tous les autres fichiers Swift, mais c'était aussi , pour une raison très étrange, également dans la phase Copy Bundle Resources, avec toutes les ressources XIB et image.

Je ne sais pas du tout comment cela est arrivé, mais le retirer de la phase de construction supplémentaire a résolu le problème.

31
Craig Otis

En ce qui me concerne, j’ai rencontré cette erreur lorsque ma cible de test n’avait pas certains fichiers Swift que ma cible de génération d’application avait dans des sources de compilation. C'était très déroutant parce que le «type non déclaré» était utilisé dans de nombreux autres endroits sans aucun problème et que l'erreur semblait vague. Donc, il fallait bien sûr ajouter le fichier contenant le «type non déclaré» à la cible de test.

166
mattorb

@Craig Otis a déjà répondu à cette question, mais le problème survient lorsque les classes en question n'appartiennent pas aux mêmes cibles. Généralement, la cible de test est manquante. Assurez-vous simplement que les cases suivantes sont cochées.


target membership

Modifier

Pour voir les membres cibles. Sélectionnez votre fichier puis ouvrez l'inspecteur de fichiers (⌥ + ⌘ + 1) [ option ] + [ commande ] + 1

detailed description

153
Edwin

Dans le menu XCode Product-> Clean puis Product-> Build a fonctionné pour moi. J'ai rencontré ce problème lorsque j'ai ajouté un nouveau ViewController à mon projet dans un nouveau groupe/dossier.

16
Array

La cause pour moi était un nom de fonction qui commençait par les mêmes caractères qu'un type:

@IBOutlet weak var tableView: CustomTableView!

et dans l'implémentation j'avais une fonction commençant par CustomTableView

func CustomTableView(tableView: CustomTableView, dataForRow row:  Int) -> NSData {...}

Le correctif consistait à modifier la signature de la fonction afin qu'elle ne commence pas par les mêmes caractères que le type (CustomTableView), par exemple:

func dataForRow(row: Int, tableView: CustomTableView) -> NSData {...}

C'était un message d'erreur très trompeur pour la cause réelle dans mon cas.

11
Andrew

J'ai eu exactement le même problème. Certains fichiers de mon framework n'étaient pas accessibles depuis d'autres classes du même module.

Pour une raison quelconque, les fichiers ajoutés au framework dans Xcode ne faisaient pas partie des sources de compilation. Si votre fichier Swift ne fait pas partie des sources de compilation, vous devez les ajouter en appuyant sur le signe + et en les sélectionnant dans la fenêtre contextuelle.

Screenshot 1

Assurez-vous également que le fichier fait partie de la cible de la structure. (La petite case dans la capture d'écran ci-dessous doit être cochée)

Screenshot 2

11
Groot

Dans mon application, j'ai un délégué d'application et d'autres classes auxquelles les tests doivent accéder en tant que public. Comme indiqué ci-dessous , j'importe ensuite mon application dans mes tests.

Lorsque j'ai récemment créé deux nouvelles classes, leurs cibles de test étaient à la fois la partie principale et la partie test. En les retirant des tests, le problème a été résolu.

4
Nate Uni

Si quelqu'un rencontre un problème similaire mais que le correctif Compile Sources ne résout pas le problème, le redémarrage de Xcode peut (cela a fonctionné pour moi). Ma version de Xcode est Version 6.1 (6A1052d).

3
lindon fox

Cela peut également se produire si, par accident, vous capitalisez le nom du paramètre et que vous l'appelez de la même manière que l'objet.

class func didRecieveData(BlockItems: [BlockItems])
3
Rindom

Cela peut également arriver si vous avez une fonction portant le même nom qu'un type d'objet dans votre signature. Par exemple:

class func Player(playerObj: Player)

confondra le compilateur (et à juste titre), car il cherchera d’abord localement dans le fichier avant de regarder d’autres fichiers. Donc, il regarde "Player" dans la signature et pense que ce n'est pas un objet dans cette étendue, mais une fonction, donc quelque chose ne va pas.

C'est peut-être une bonne raison pour laquelle je ne devrais pas capitaliser les fonctions de classe. :)

2
Maxwell

J'ai essayé la plupart des solutions proposées ici, mais j'ai finalement supprimé le fichier, puis créé à nouveau. Xcode a été corrigé: /

2
Yusuf X

Cela pourrait aider quelqu'un.

J'ai créé un nouveau projet de test avec Core Data appelé "CoreData". En bref, j'ai «Utilisation d'un type non déclaré» pour NSManagedObjectContext et d'autres classes de données de base. Après plusieurs tentatives d’importation, d’ajouts aux phases de construction, etc., j’ai supprimé le projet et lancé un nouveau projet appelé "TestingCoreData" et tout a bien fonctionné.

Ne nommez pas (test) Des projets comme le nom des classes

2
Babac

J'ai reçu ce message d'erreur dans Xcode 8 lors du refactoring de code dans un framework, il en ressort que j'ai oublié de déclarer la classe dans le framework sous la forme public

2
tsuchi.one

Dans mon cas, cela était dû à l'utilisation d'un nom de sous-classe dans la ligne suivante comme nom de variable avec un type différent:

var binGlow: pipGlow = pipGlow(style: "Bin")
var pipGlow: PipGlowSprite = PipGlowSprite()

Notez que dans la ligne 1, pipGlow est le nom de la sous-classe (de SKShapeNode), mais dans la deuxième ligne, j’utilisais pipGlow comme nom de variable. Ce n'était pas seulement un mauvais style de codage, mais apparemment aussi un non-non! Une fois que je change la deuxième ligne à:

var binGlow: pipGlow = pipGlow(style: "Bin")
var pipGlowSprite: PipGlowSprite = PipGlowSprite()

Je n'ai plus reçu l'erreur. J'espère que ça aidera quelqu'un!

1
zeeple

Lors du test du code Swift appartenant à l'application, assurez-vous d'abord que la cible de test crée l'application en tant que dépendance. Ensuite, dans votre test, importez l'application en tant que module. Par exemple:

@testable import MyApplication

Cela rendra les objets Swift faisant partie de l'application disponibles pour le test.

1
quellish

Dans mon cas, les sources de compilation de TestTarget avaient des fichiers provenant de la cible principale .

Ref:

 Test Target contains files from main target in compile sources tab 

Pourquoi cela arrive?

  • Cela se produit puisque nous vérifions l'association TestTarget lors de la création du fichier.

  • Ou cochez manuellement cette option dans l'inspecteur.

    Ref:

     Create File - Test Target is Checked 

Comment ai-je résolu?

  • J'ai supprimé les fichiers de la cible principale de la source de compilation de Test Target
1
Ratz

Dans mon cas, une erreur a été commise par moi. J'ai ajouté un nouveau fichier sous "OS X> Source> Cocoa Class" au lieu de "iOS> Source> Cocoa Touch Class". 

Nettoyer le projet a résolu mon problème.

Étapes: Produit -> Nettoyer (ou Maj + Cmd + K)

1
Anshul Tiwari

Ne pas ajouter la déclaration d'importation correcte peut également constituer une erreur évidente. Pour moi, j'avais simplement oublié d'importer l'UIKit prioritaire.

0
Mississippi

Comme d’autres, c’est un code indépendant qui a entraîné le dysfonctionnement de @testable.

Dans ma cible de test, il y avait un fichier d'en-tête Objective-C qui avait 

@import ModuleUnderTest;

J'ai enlevé cette ligne (parce que l'import était en réalité inutile) et miraculeusement @testable à recommencer à fonctionner.

Je n’ai pu que localiser cela, mais en retirant tout de mon projet et en le rajoutant petit à petit jusqu’à ce qu’il échoue. Finalement, j'ai trouvé la ligne de code qui pose problème.

0
Oliver Pearmain

Parfois, les erreurs peuvent être très stupides

Avant de vérifier toutes les solutions ici, assurez-vous d’avoir importé tous les éléments de base.

     import Foundation
     import UIKit

Il est tout à fait possible que, lorsque vous importez des fichiers de l'extérieur dans votre projet, ces informations de base manquent parfois, comme je l'ai déjà fait une fois.

0
Suraj K Thomas

Dans mon cas, cela était dû au codage de texte des fichiers de Swift . Un fichier indiquait «Pas de codage explicite» et, après l'avoir converti en «UTF-8», le problème était résolu.

Et la raison pour laquelle l'encodage de texte du fichier n'est pas explicite est que j'ai copié tout le code d'un autre fichier Swift.

Capture d'écran sans codage explicite

 enter image description here

Capture d'écran UTF-8

 enter image description here

0
Jirui

Dans mon cas, je voulais ajouter une méthode avec un objet Swift personnalisé comme paramètre de type et le nom que j'ai donné à la variable dans le paramètre était exactement le même que le nom de classe de l'objet personnalisé

Les problèmes ressemblaient à ceci:

func moveBlob(**blob** : blob){
    ...code
}

La partie dans bold characters causait l'erreur de type non déclaré

0
cmario

si vous y accédez à partir de module ou Target, vous en aurez simplement besoin pour public it

0
Sultan Ali

Peut-être avez-vous ajouté la classe avec un certain "FirstNameClass" et ensuite renommé manuellement en "ColoredDotView". Essayez de copier le contenu de la classe "ColoredDotView" dans le presse-papiers, supprimez "ColoredDotView" du projet et ajoutez agin.

Cet identifiant corrige un problème similaire de ma part.

0
Almin

comme d'autres bien mentionné et dans ce fil

utilisation de fichiers Swift inutiles dans "copier les ressources de l'ensemble"  screen shot for helping

0
nova

Ma situation est que je glisse un nouveau fichier XXView.Swift dans le projet. Et déclarer un type de vue comme étant XXView, puis l'erreur "utilisation de type non déclaré ....".

Je viens d'essayer d'ajouter mon XXView.Swift à la cible de test qui a résolu l'erreur. Mais je ne voulais pas que ma classe d'interface utilisateur soit impliquée dans la cible de test.

Enfin, j'ai trouvé mon ViewController déjà dans la cible de test, ce qui ne devrait pas se produire. (Je pense que, parce que je crée le VC avec un xctemplate, il sera automatiquement inclus dans la cible de test)

Je supprime le contrôleur de vue de la cible de test, puis ma XXView n’a plus besoin d’être ajoutée à la cible de test.

Conclusion: assurez-vous que tous vos fichiers associés doivent également décocher la cible de test.

0
Wangdu Lin

Au cas où quelqu'un ferait la même erreur idiote que j'ai faite ...

Je recevais cette erreur car en renommant mon fichier source, j'ai accidentellement supprimé le. du nom de fichier et le compilateur a donc traité le fichier comme un fichier texte brut et non comme une source à compiler.

je voulais donc renommer le fichier en MyProtocol.Swift mais je l'ai accidentellement nommé MyProtocolswift

C'est une simple erreur, mais il n'était pas évident que ce soit ce qui se passait.

0
Marc Renaud