"Uso del tipo non dichiarato" in Swift, anche se il tipo è interno ed esiste nello stesso modulo


173

Ho un tipo nel mio modulo:

import Cocoa

class ColoredDotView : NSView {
   ...
}

Viene utilizzato in diverse classi senza problemi:

class EditSubjectPopoverController : NSObject {

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

Ma per qualche motivo , quando lo uso in una classe specifica , ho errori di compilazione sul tipo:

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'errore di compilazione è:

EditTaskPopoverController.swift: 15: 49: Uso del tipo non dichiarato 'ColoredDotView'

Che non capisco. È il primo errore di compilazione nel file e il resto degli errori sono tutti sintomatici del primo. Inoltre, non ci sono altri file con errori di compilazione. Non capisco perché il tipo non sia dichiarato, poiché il file si trova nello stesso modulo:

inserisci qui la descrizione dell'immagine

Ho provato a pulire il progetto, pulire la cartella di build e riavviare Xcode, senza alcun risultato. Quali potenziali passi falsi possono causare un undeclared typeerrore del compilatore in Swift?


Ho avuto molti casi in cui l'errore effettivo è di alcune righe (o più) più in basso e Xcode etichetta erroneamente qualcosa di innocuo con un messaggio di errore. Vedi se riesci a far scomparire quell'errore cancellando il resto del codice, quindi aggiungilo di nuovo a poco a poco ...
Nate Cook,

Grazie Nate - purtroppo rimuovo le vardichiarazioni e arrivo a una build di passaggio. Quindi aggiungo una delle dichiarazioni in alto e l'errore ritorna immediatamente: imgur.com/VUUBK2K
Craig Otis

Risposte:


200

Per me, ho riscontrato questo errore quando il mio target di test non aveva alcuni file veloci che il mio target di compilazione dell'app aveva nelle fonti di compilazione. Era molto confuso perché il "tipo non dichiarato" veniva usato in così tanti altri luoghi senza problemi e l'errore sembrava vago. Quindi c'era ovviamente la soluzione per aggiungere il file contenente il "tipo non dichiarato" alla destinazione del test.


2
Lo stesso per me: il problema si verifica quando una classe utilizzata da un'altra inclusa nel target Test non è inclusa anche nel target Test! (╯ ° □ °) ╯︵ ┻━┻
Francesco Vadicamo

2
Hai appena risolto un problema che mi aveva irritato per mezz'ora. Avevo importato alcune precedenti classi Swift in un progetto attuale, ma ovviamente non avevo ancora aggiunto le classi più vecchie al target del test. Ma il completamento automatico mi ha indotto a pensare che tutto andasse bene ... fino a quando ho provato a costruire ed eseguire. Che cosa ...! Grazie mille.
Jim Hillhouse,

2
Questo ha risolto il problema anche per me. Avevo cliccato su un file e ho duplicato una copia di esso. La nuova copia era elencata ma non inclusa nelle "fonti di compilazione"
Ron Myschuk,

1
Nel mio caso avevo selezionato 3 target (Project, UI & Unit test), dovevo deselezionare gli UI e gli unit test target per risolvere questo errore
Frakcool,

1
"Soluzione ovviamente ..." presume che il lettore capisca come aggiungere l'obiettivo del test. Per noi che abbiamo appena iniziato con Xcode, non è un momento "ovviamente ...". Ho votato la risposta di @ edwin quando ha finito la tua risposta.
Michael,

181

@Craig Otis ha già risposto a questo problema, ma il problema è causato quando le classi in questione non appartengono agli stessi target, di solito manca il target del test. Assicurati solo che le seguenti caselle di controllo siano spuntate.


appartenenza target

modificare

Per vedere l'appartenenza di destinazione. Seleziona il tuo file quindi apri la finestra di ispezione dei file (⌥ + ⌘ + 1) [ opzione ] + [ comando ] + 1

descrizione dettagliata


non sono sicuro ma quando deseleziono il target "TEST" (in questo caso è YAWA-WeatherTest). costruito senza errori.
Dell

Potete chiarire dove in XCode impostare questo abbonamento Target? Non ricordo di averlo visto prima. Grazie.
Casey Perkins,

2
In effetti, deseleziona l'obiettivo del test, poiché è per questo che "@testable import ..." nei progetti di test.
ha disegnato ..

La schermata è molto utile. Grazie!
Michael,

37

Accidenti, finalmente ho diagnosticato questo. In qualche modo , il file Swift offensivo si EditTaskPopoverController.swifttrovava in due diverse fasi di compilazione.

Era Compile Sourcescorrettamente, con tutti gli altri file Swift, ma era anche , per qualche strana ragione, anche nella Copy Bundle Resourcesfase, insieme a tutte le mie risorse XIB e di immagine.

Non ho idea di come sia arrivato lì, ma rimuoverlo dalla fase di compilazione aggiuntiva ha risolto il problema.


Ho avuto lo stesso problema, perché stavo usando github.com/kronenthaler/mod-pbxproj e swift, avevo accidentalmente aggiunto swift ai tipi come PBXResourcesBuildPhase invece di PBXSourcesBuildPhase in mod-pbxproj
richy

2
Compagno! Salvavita, mi stava rovinando la testa. Saluti
SparkyRobinson,

27

Nel menu XCode Prodotto-> Pulisci e poi Prodotto-> Build ha funzionato per me. Ho riscontrato questo problema quando ho aggiunto un nuovo ViewController al mio progetto nel nuovo gruppo / cartella.


5
2 ore e non ho mai pensato di fare clic sul pulsante di creazione per incorporare il framework dopo aver installato un pod ... Ora me ne vado ...
Cruceo,

1
Sprecato molto tempo provando altre risposte ma mai pulito e costruito. Grazie mille
Zeero0

Ho avuto questo errore mentre giocavo con SwiftUI in Xcode 11.0 beta 5, seguendo il tutorial di Apple. L'area di disegno mostrava correttamente altri file, ma un file appena aggiunto generava questo errore, dicendo che LandmarkRow_Previews era un tipo non dichiarato. Solo la build Clean ha risolto il problema.
salo.dm,

Questa risposta è l'equivalente dei supporti tecnici: "Hai provato a riavviare il dispositivo?" Un buon consiglio :)
testato il

14

Ho avuto lo stesso identico problema. Alcuni file nel mio framework non erano raggiungibili da altre classi all'interno dello stesso modulo.

Per qualche motivo i file che erano stati aggiunti al framework in Xcode non facevano parte delle fonti di compilazione. Se il tuo file Swift non fa parte delle fonti di compilazione, devi aggiungerle toccando + e selezionandole nel popup.

Schermata 1

Assicurarsi inoltre che il file faccia parte della destinazione del framework. (La casella piccola nello screenshot qui sotto dovrebbe essere selezionata)

Schermata 2


12

La causa per me era un nome di funzione che iniziava con gli stessi caratteri di un tipo:

@IBOutlet weak var tableView: CustomTableView!

e nell'implementazione ho avuto una funzione che inizia con CustomTableView

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

La correzione consisteva nel modificare la firma della funzione in modo che non iniziasse con gli stessi caratteri del tipo (CustomTableView), ad esempio:

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

Questo è stato un messaggio di errore molto fuorviante per la vera causa nel mio caso.


1
Mille grazie per aver pubblicato questa correzione Andrew, è stato di grande aiuto. Il messaggio di errore è certamente fuorviante.
jjc99,

7

Nel caso in cui qualcuno riscontri un problema simile ma la correzione Compile Sources non risolva il problema, il riavvio di Xcode potrebbe (ha funzionato per me). La mia versione di Xcode è Version 6.1 (6A1052d).


Il riavvio ha funzionato per me, anche se l'errore si è ripresentato dopo una compilazione riuscita, senza ulteriori modifiche al codice.
Non comune

Il riavvio di Xcode risolve così tanti problemi che Apple dovrebbe davvero fare qualcosa al riguardo.
Forgia il

5

Nella mia app ho delegato app e altre classi a cui i test devono accedere come pubblici. Come indicato qui , quindi importare la mia app nei miei test.

Quando di recente ho creato due nuove classi, i loro obiettivi di test erano sia le parti principali che quelle di prova. Rimuovendoli dall'appartenenza ai test è stato risolto il problema.


5

Nel mio caso, le origini di compilazione del TestTarget avevano file dal Target principale .

Rif :

Test Target contiene file dal target principale nella scheda Compilare le fonti

Perché questo succede?

  • Ciò accade poiché controlliamo l'associazione TestTarget durante la creazione del file

  • O selezionando manualmente questa opzione dall'ispettore.

    Rif :

    Crea file: la destinazione del test è selezionata

Come ho risolto?

  • Ho rimosso i file del target principale dalla fonte di compilazione di Test Target

5

? A volte gli errori possono essere molto sciocchi

Prima di controllare tutte le soluzioni qui, assicurati di aver importato tutte le cose di base

     import Foundation
     import UIKit

È abbastanza probabile che quando importi alcuni file dall'esterno al tuo progetto, il che potrebbe non comprendere queste cose di base come ho sperimentato una volta.


mi è successo per CLLocationManagerDelegate e tutto quello che dovevo fare era importare CoreLocation su questo altro file come se avessi perso 20 minuti.
Derek,

4

Ho provato molte delle soluzioni offerte qui, ma alla fine ho eliminato il file e creato di nuovo, e Xcode è stato semplificato: /


Questo ha funzionato anche per me. Rimosso il riferimento, pulito, compilato, quindi aggiunto nuovamente il file.
e il

GRAZIE! Questo è abbastanza bizzarro. Ho appena lavorato anche per me. Eliminato il vecchio codice, copiato il vecchio codice nel nuovo file, non è stato nemmeno necessario pulire / compilare.
Timman,

4

Questo può accadere anche se per sbaglio si capitalizza il nome del parametro e lo si chiama come l'oggetto.

class func didRecieveData(BlockItems: [BlockItems])

3

Questo potrebbe aiutare qualcuno.

Ho creato un nuovo progetto di test con Core Data chiamato "CoreData". A breve ho "Uso del tipo non dichiarato" per NSManagedObjectContext e altre classi di dati di base. Dopo diversi tentativi di importazione, aggiunta a fasi di costruzione, ecc. Ho eliminato il progetto e ne ho avviato uno nuovo chiamato "TestingCoreData" e tutto ha funzionato bene.

Non nominare (testare) progetti come il nome delle classi


3

Ciò può accadere anche se nella firma è presente una funzione con lo stesso nome di un tipo di oggetto. Per esempio:

class func Player(playerObj: Player)

causerà la confusione del compilatore (e giustamente) poiché il compilatore cercherà prima localmente all'interno del file prima di guardare altri file. Quindi guarda "Player" nella firma e pensa, non è un oggetto in questo ambito, ma una funzione, quindi qualcosa non va.

Forse questo è un buon motivo per cui non dovrei capitalizzare le funzioni di classe. :)


3

Ho ricevuto questo messaggio di errore in Xcode 8 durante il refactoring del codice in un framework, risulta che ho dimenticato di dichiarare la classe nel framework come public


2

Forse hai aggiunto classe con qualche "FirstNameClass" e successivamente rinominato manualmente in "ColoredDotView". Prova a copiare il contenuto della classe "ColoredDotView" negli Appunti, rimuovi "ColoredDotView" dal progetto e aggiungi agin.

Questo id risolve un problema simile da parte mia.


2

Nel mio caso è stato un errore fatto da me. Ho aggiunto un nuovo file come "OS X> Sorgente> Classe Cocoa", anziché "iOS> Sorgente> Cocoa Touch Class".


2

Nel mio caso, ciò è stato causato da un nome di sottoclasse utilizzato nella riga successiva come nome di variabile con un tipo diverso:

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

Si noti che nella riga 1, pipGlow è il nome della sottoclasse (di SKShapeNode), ma nella riga due, utilizzavo pipGlow come nome di variabile. Questo non era solo un cattivo stile di codifica, ma apparentemente anche un vero e proprio no-no! Dopo aver cambiato la seconda riga in:

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

Non ho più ricevuto l'errore. Spero che questo aiuti qualcuno!


2

Quando si esegue il test del codice Swift che appartiene all'applicazione, assicurarsi innanzitutto che la destinazione del test stia creando l'applicazione come dipendenza. Quindi, nel test, importa l'applicazione come modulo. Per esempio:

@testable import MyApplication

Ciò renderà gli oggetti Swift che fanno parte dell'applicazione disponibili per il test.


2

Nel mio caso, ciò è stato causato dalla codifica del testo dei file rapidi. Un file mostrava "Nessuna codifica esplicita" e, dopo averlo convertito in "UTF-8", il problema è stato risolto.

E il motivo per cui la codifica del testo del file non è esplicita è che ho copiato tutto il codice da un altro file rapido.

Schermata di codifica esplicita

inserisci qui la descrizione dell'immagine

Screenshot UTF-8

inserisci qui la descrizione dell'immagine


2

La pulizia del progetto ha risolto il mio problema.

Passaggi: Prodotto -> Pulisci (o Maiusc + Cmd + K)


1

Nel mio caso volevo aggiungere un metodo con un oggetto rapido personalizzato come parametro di tipo e il nome che ho dato alla variabile nel parametro era esattamente lo stesso del nome della classe di oggetti personalizzati

I problemi erano qualcosa del genere:

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

La parte in grassetto causava l'errore di tipo non dichiarato



1

Come altri, era un codice non correlato a causare il @testablemalfunzionamento.

Nel mio obiettivo di test c'era un file di intestazione Objective-C che aveva

@import ModuleUnderTest;

Ho rimosso questa riga (perché l'importazione non era effettivamente necessaria) e miracolosamente @testablericominciato a funzionare.

Sono stato solo in grado di rintracciarlo, ma rimuovendo tutto dal mio progetto e aggiungendolo a poco a poco fino a quando non ha funzionato. Alla fine ho trovato la riga di codice problematica.


1

se si accede da diverso moduleo Targetpoi basta per publicesso


1

Nel caso in cui qualcuno commetta lo stesso stupido errore che ho fatto ...

Stavo ottenendo questo errore perché nel rinominare il mio file di origine, ho rimosso accidentalmente il file. dal nome del file e quindi il compilatore ha trattato il file come un semplice file di testo e non come sorgente da compilare.

quindi intendevo rinominare il file MyProtocol.swift ma lo ha accidentalmente chiamato MyProtocolswift

È un semplice errore, ma non è stato subito ovvio che questo è quello che stava succedendo.


1

Non aggiungere la corretta delimitazione delle importazioni può anche essere un'ovvia mancanza. Per me, avevo semplicemente omesso di importare PriorityUIKit.


1

La mia situazione è che trascino un nuovo file XXView.swift nel progetto. E dichiarare un tipo di visualizzazione come XXView, quindi l'errore "uso di tipo non dichiarato ....".

Provo solo ad aggiungere il mio XXView.swift alla destinazione del test che ha risolto l'errore. Ma non volevo che la mia classe UI fosse coinvolta nel target del test.

Alla fine, ho trovato il mio ViewController già nella destinazione del test che non dovrebbe accadere. (Penso che, poiché creo il VC da una xctemplate, quindi, verrà automaticamente incluso nella destinazione del test)

Rimuovo il controller di visualizzazione dalla destinazione del test, quindi il mio XXView non è più necessario aggiungere alla destinazione del test.

Conclusione: assicurati che anche tutti i tuoi file correlati debbano deselezionare la destinazione del test.


1

Dopo aver trascorso un'ora su questo errore, ho scoperto che il file del modulo è duplicato. elimina il file aggiuntivo e sposta + cmd + k per pulire e l'errore scompare.


Questa potrebbe essere una domanda stupida ma puoi spiegarci di più? Questo succede anche con file duplicati rapidi, o gruppi duplicati ecc.? Ha funzionato ma mi piace sapere di più sul perché funziona piuttosto che accettare che funzioni. Grazie per la soluzione a proposito!
Cody Vollrath il

1

Nel mio caso, il problema era che un nuovo classnon veniva riconosciuto. Ho risolto il problema eliminando la classe e aggiungendola di nuovo, ma questa volta verificando l' Watch App Extensionopzione durante la creazione della nuova classe.

inserisci qui la descrizione dell'immagine

Si noti che nella mia applicazione è presente un'estensione per l'app di controllo.


Grazie e anche nel mio caso avevo solo bisogno di aggiungere il file al corretto Target.
Coletrain,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.