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

173

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 une raison quelconque , 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 du 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 sont toutes symptomatiques de la première. De plus, il n'y a pas d'autres fichiers avec des erreurs de compilation. Je ne comprends pas pourquoi le type n'est pas déclaré, car le fichier est dans le même module:

entrez la description de l'image ici

J'ai essayé de nettoyer le projet, de nettoyer le dossier de construction et de redémarrer Xcode, en vain. Quels faux pas potentiels peuvent provoquer une undeclared typeerreur du compilateur dans Swift?

Craig Otis
la source
J'ai eu beaucoup de cas où l'erreur réelle est quelques lignes (ou plus) plus bas, et Xcode marque par erreur quelque chose d'innocent avec un message d'erreur. Voyez si vous pouvez faire disparaître cette erreur en effaçant le reste de votre code, puis ajoutez-le petit à petit ...
Nate Cook
Merci Nate - malheureusement, je supprime les vardéclarations et je passe à une construction passagère. Ensuite, j'ajoute l' une des déclarations en haut, et l'erreur est de retour immédiatement: imgur.com/VUUBK2K
Craig Otis

Réponses:

200

Pour moi, j'ai rencontré cette erreur lorsque ma cible de test ne contenait pas de fichiers rapides que ma cible de construction d'application avait dans les sources de compilation. C'était très déroutant parce que le «type non déclaré» était utilisé sans problème dans tant d'autres endroits, et l'erreur semblait vague. La solution était donc bien sûr d'ajouter le fichier contenant le 'type non déclaré' à la cible de test.

mattorb
la source
2
La même chose pour moi: le problème survient lorsqu'une classe utilisée par une autre incluse dans la cible de test, n'est pas incluse dans la cible de test aussi! (╯ ° □ °) ╯︵ ┻━┻
Francesco Vadicamo
2
Vous venez de résoudre un problème qui me tourmentait depuis une demi-heure. J'avais importé des classes Swift précédentes dans un projet en cours, mais je n'avais évidemment pas encore ajouté les anciennes classes à la cible de test. Mais l'auto-complétion m'a fait penser que tout allait bien ... jusqu'à ce que j'essaye de construire et de courir. Qu'est-ce que ...! Merci beaucoup.
Jim Hillhouse
2
Cela a également résolu le problème pour moi. J'avais cliqué sur un fichier et un fichier -> en avait dupliqué une copie. La nouvelle copie a été répertoriée mais pas incluse dans les "sources de compilation"
Ron Myschuk
1
Dans mon cas, j'avais sélectionné 3 cibles (projets, UI et tests unitaires), je devais désélectionner les cibles de tests UI et unitaires afin de résoudre cette erreur
Frakcool
1
"Solution bien sûr ..." suppose que le lecteur comprend comment ajouter la cible de test. Pour nous qui commençons avec Xcode, ce n'est pas un moment "bien sûr ...". J'ai voté pour la réponse de @ edwin alors qu'il terminait votre réponse.
Michael
181

@Craig Otis a déjà répondu à cette question, mais le problème est causé 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 à cocher suivantes sont cochées.


adhésion cible

Éditer

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

Description détaillée

Edwin
la source
pas sûr mais quand je décoche la cible "TEST" (dans ce cas, c'est YAWA-WeatherTest). il a construit sans erreur.
dellos
Pouvez-vous préciser où dans XCode définir cette adhésion cible? Je ne me souviens pas l'avoir vu auparavant. Merci.
Casey Perkins
2
En effet, décochez la cible de test, car c'est pour cela que l'on "@testable import ..." dans les projets de test.
nul.
La capture d'écran est très utile. Merci!
Michael
37

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

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

Je n'ai aucune idée de comment il est arrivé là, mais le retirer de la phase de construction supplémentaire a résolu le problème.

Craig Otis
la source
J'ai eu le même problème qu'il s'est avéré, parce que j'utilisais github.com/kronenthaler/mod-pbxproj et swift, j'avais accidentellement ajouté swift aux types PBXResourcesBuildPhase au lieu de PBXSourcesBuildPhase dans mod-pbxproj
riche
2
Camarade! Sauveur de vie, me ruinait la tête à ce sujet. Cheers
SparkyRobinson
27

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

Tableau
la source
5
2 heures, et je n'ai jamais pensé à cliquer sur le bouton de construction pour incorporer le framework après l'installation d'un pod ... Je vais partir maintenant ...
Cruceo
1
J'ai perdu beaucoup de temps à essayer d'autres réponses mais jamais nettoyées et construites. Merci beaucoup
Zeero0
J'ai eu cette erreur en jouant avec SwiftUI dans Xcode 11.0 beta 5, tout en suivant le tutoriel Apple. Le canevas affichait correctement d'autres fichiers, mais un fichier récemment ajouté a généré cette erreur, indiquant que LandmarkRow_Previews était un type non déclaré. Seul le build Clean a résolu le problème.
salo.dm
Cette réponse est l'équivalent des supports techniques: "Avez-vous essayé de redémarrer votre appareil?" Une bonne astuce :)
testée
14

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

Pour une raison quelconque, les fichiers qui avaient été 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 + et en les sélectionnant dans la fenêtre contextuelle.

Capture d'écran 1

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

Capture d'écran 2

Groot
la source
12

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'ai eu 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.

Andrew
la source
1
Merci beaucoup d'avoir posté ce correctif Andrew, c'était d'une grande aide. Le message d'erreur est certainement trompeur.
jjc99 le
7

Si quelqu'un rencontre un problème similaire mais que le correctif des sources de compilation 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).

renard lindon
la source
Le redémarrage a fonctionné pour moi, bien que l'erreur soit réapparue après une compilation réussie, sans autre changement de code.
Peu fréquent
Le redémarrage de Xcode corrige tellement de problèmes qu'Apple devrait vraiment faire quelque chose.
Forge
5

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é ici , 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 de test. Les retirer de leur adhésion aux tests a résolu le problème.

Nate Uni
la source
5

Dans mon cas, les sources de compilation du TestTarget contenaient des fichiers de la cible principale .

Réf :

La cible de test contient les fichiers de la cible principale dans l'onglet des sources de compilation

Pourquoi cela arrive?

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

  • Ou en cochant manuellement cette option depuis l'inspecteur.

    Réf :

    Créer un fichier - La cible de test est vérifiée

Comment ai-je résolu?

  • J'ai supprimé les fichiers de la cible principale de la source de compilation de la cible de test
Ratz
la source
5

? Parfois, les erreurs peuvent être très ridicules

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 vers votre projet, vous risquez de manquer ces choses de base comme je l'ai vécu une fois.

Suraj K Thomas
la source
cela m'est arrivé pour CLLocationManagerDelegate et tout ce que j'avais à faire était d'importer CoreLocation sur cet autre fichier comme ugh pourquoi ai-je perdu 20 minutes.
derek le
4

J'ai essayé de nombreuses solutions proposées ici, mais j'ai finalement supprimé le fichier et l'ai créé à nouveau, et Xcode a été apaisé: /

Yusuf X
la source
Cela a fonctionné pour moi aussi. Suppression de la référence, nettoyage, construction, puis ajout du fichier à nouveau.
andnil
MERCI! C'est assez bizarre. J'ai juste travaillé pour moi aussi. Supprimé l'ancien, copié l'ancien code dans un nouveau fichier, n'a même pas eu à nettoyer / construire.
timman le
4

Cela peut également se produire si vous mettez accidentellement en majuscule le nom du paramètre et que vous l'appelez de la même manière que l'objet.

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

Cela pourrait aider quelqu'un.

J'ai créé un nouveau projet de test avec Core Data appelé "CoreData". Bientôt, j'ai "Utilisation de type non déclaré" pour NSManagedObjectContext et d'autres classes Core Data. Après plusieurs tentatives d'importation, d'ajout aux phases de construction, etc. J'ai supprimé le projet et en ai commencé un nouveau appelé "TestingCoreData" et tout a bien fonctionné.

Ne nommez pas (testez) les projets comme le nom des classes

Babac
la source
3

Cela peut également se produire 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)

entraînera la confusion du compilateur (et à juste titre) puisque le compilateur 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 portée, 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. :)

Maxwell
la source
3

J'ai reçu ce message d'erreur dans Xcode 8 lors de la refactorisation du code dans un framework, il s'avère que j'ai oublié de déclarer la classe dans le framework comme public

tsuchi.one
la source
2

Peut-être avez-vous ajouté une classe avec certains "FirstNameClass" et après cela, renommer manuellement en "ColoredDotView". Essayez de copier le contenu de la classe «ColoredDotView» dans le presse-papiers, supprimez «ColoredDotView» du projet et ajoutez-en un autre.

Cet identifiant résout un problème similaire de ma part.

Almin
la source
2

Dans mon cas, c'était une erreur de ma part. J'ai ajouté un nouveau fichier comme "OS X> Source> Cocoa Class", au lieu de "iOS> Source> Cocoa Touch Class".

Javier Calatrava Llavería
la source
2

Dans mon cas, cela a été causé par un nom de sous-classe utilisé dans la ligne suivante comme nom de variable avec un type différent:

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

Notez qu'à la ligne 1, pipGlow est le nom de la sous-classe (de SKShapeNode), mais à la ligne deux, 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 en:

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!

zeeple
la source
2

Lorsque vous testez du code Swift appartenant à l'application, assurez-vous d'abord que la cible de test construit 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 qui font partie de l'application disponibles pour le test.

apaiser
la source
2

Dans mon cas, cela a été causé par l'encodage de texte de Swift Files. Un fichier montrait «No Explicit Encoding», et après conversion en «UTF-8», le problème a été résolu.

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

Aucune capture d'écran d'encodage explicite

entrez la description de l'image ici

Capture d'écran UTF-8

entrez la description de l'image ici

Jirui
la source
2

Le nettoyage du projet a résolu mon problème.

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

Anshul Tiwari
la source
1

Dans mon cas, je voulais ajouter une méthode avec un objet swift personnalisé en tant que 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 la classe d'objet personnalisé

Les problèmes étaient quelque chose comme ceci:

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

La partie en caractères gras provoquait l'erreur de type non déclaré

cmario
la source
1

comme d'autres l'ont bien mentionné et dans ce fil

utilisation de fichiers Swift inutiles dans les «ressources de l'ensemble de copie» capture d'écran pour aider

Hamed Nova
la source
1

Comme d'autres, c'était un code non lié qui causait un @testabledysfonctionnement du.

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

@import ModuleUnderTest;

J'ai supprimé cette ligne (car l'importation était en fait inutile) et j'ai @testablerecommencé miraculeusement à travailler.

Je n'ai pu que le localiser, mais en supprimant tout de mon projet et en le rajoutant petit à petit jusqu'à ce qu'il échoue. Finalement, j'ai trouvé la ligne de code problématique.

Oliver Pearmain
la source
1

si vous accédez à partir de différents moduleou Targetalors vous avez juste besoin à publicce

Sultan Ali
la source
1

Au cas où quelqu'un ferait la même erreur stupide que moi ...

J'obtenais 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.

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

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

Marc Renaud
la source
1

Ne pas ajouter la délcaration d'importation correcte peut également être un échec évident. Pour moi, j'avais simplement omis d'importer PriorityUIKit.

Timbre
la source
1

Ma situation est que je glisse un nouveau fichier XXView.swift dans le projet. Et déclarez qu'un type de vue est XXView puis l'erreur "utilisation de type non déclaré ....".

J'essaie juste d'ajouter mon XXView.swift à la cible de test dont il 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 par un xctemplate donc, il sera automatiquement inclus dans la cible de test)

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

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

Wangdu Lin
la source
1

Après avoir passé une heure sur cette erreur, j'ai constaté que le fichier du module était dupliqué. supprimez le fichier supplémentaire, et shift + cmd + k pour nettoyer et l'erreur a disparu.

Alirza Eram
la source
C'est peut-être une question stupide, mais pouvez-vous expliquer plus à ce sujet? Cela se produit-il également avec des fichiers swift en double, ou des groupes en double, etc.? Cela a fonctionné mais j'aime en savoir plus sur les raisons de son fonctionnement que d'accepter simplement que cela fonctionne. Merci pour la solution au fait!
Cody Vollrath
1

Dans mon cas, le problème était qu'un nouveau classn'était pas reconnu. J'ai résolu le problème en supprimant la classe et en l'ajoutant à nouveau, mais cette fois en cochant l' Watch App Extensionoption lors de la création de la nouvelle classe.

entrez la description de l'image ici

Veuillez noter que j'ai une extension Watch App dans mon application.

fs_tigre
la source
Merci et dans mon cas aussi juste besoin d'ajouter le fichier au bon Target.
coletrain