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:
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?
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.
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.
@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.
Pour voir les membres cibles. Sélectionnez votre fichier puis ouvrez l'inspecteur de fichiers (⌥ + ⌘ + 1) [ option ] + [ commande ] + 1
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.
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.
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.
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)
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.
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)
.
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])
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. :)
J'ai essayé la plupart des solutions proposées ici, mais j'ai finalement supprimé le fichier, puis créé à nouveau. Xcode a été corrigé: /
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
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
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!
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.
Dans mon cas, les sources de compilation de TestTarget avaient des fichiers provenant de la cible principale .
Ref:
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:
Comment ai-je résolu?
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)
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.
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.
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.
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
Capture d'écran UTF-8
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é
si vous y accédez à partir de module
ou Target
, vous en aurez simplement besoin pour public
it
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.
comme d'autres bien mentionné et dans ce fil
utilisation de fichiers Swift inutiles dans "copier les ressources de l'ensemble"
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.
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.