"Verwendung eines nicht deklarierten Typs" in Swift, obwohl der Typ intern ist und im selben Modul vorhanden ist

173

Ich habe einen Typ in meinem Modul:

import Cocoa

class ColoredDotView : NSView {
   ...
}

Es wird in verschiedenen Klassen ohne Probleme verwendet:

class EditSubjectPopoverController : NSObject {

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

Aber aus irgendeinem Grund , wenn ich es in einer bestimmten Klasse verwende, habe ich Kompilierungsfehler für den Typ:

class EditTaskPopoverController : NSObject {

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

Der Kompilierungsfehler lautet:

EditTaskPopoverController.swift: 15: 49: Verwendung des nicht deklarierten Typs 'ColoredDotView'

Was ich nicht verstehe. Es ist der erste Kompilierungsfehler in der Datei, und der Rest der Fehler ist symptomatisch für den ersten. Außerdem gibt es keine anderen Dateien mit Kompilierungsfehlern. Ich verstehe nicht, warum der Typ nicht deklariert ist, da sich die Datei im selben Modul befindet:

Geben Sie hier die Bildbeschreibung ein

Ich habe versucht, das Projekt zu bereinigen, den Build-Ordner zu bereinigen und Xcode neu zu starten, ohne Erfolg. Welche möglichen Fehltritte können einen undeclared typeCompilerfehler in Swift verursachen?

Craig Otis
quelle
Ich hatte viele Fälle, in denen der eigentliche Fehler ein paar Zeilen (oder mehr) weiter unten liegt und Xcode fälschlicherweise etwas Unschädliches mit einer Fehlermeldung markiert. Sehen Sie, ob Sie diesen Fehler beheben können, indem Sie den Rest Ihres Codes löschen, und fügen Sie ihn dann Stück für Stück wieder hinzu ...
Nate Cook
Danke Nate - leider entferne ich die varDeklarationen und komme zu einem vorübergehenden Build. Dann füge ich eine der Deklarationen oben hinzu und der Fehler ist sofort wieder da: imgur.com/VUUBK2K
Craig Otis

Antworten:

200

Bei mir trat dieser Fehler auf, als mein Testziel keine schnellen Dateien hatte, die mein App-Build-Ziel in Kompilierungsquellen hatte. Es war sehr verwirrend, weil der "nicht deklarierte Typ" an so vielen anderen Orten ohne Probleme verwendet wurde und der Fehler vage schien. Daher bestand die Lösung natürlich darin, die Datei mit dem 'nicht deklarierten Typ' zum Testziel hinzuzufügen.

mattorb
quelle
2
Das gleiche gilt für mich: Das Problem tritt auf, wenn eine Klasse, die von einer anderen im Testziel enthaltenen Klasse verwendet wird, auch nicht im Testziel enthalten ist! (╯ ° □ °) ╯︵ ┻━┻
Francesco Vadicamo
2
Sie haben gerade ein Problem gelöst, das mich eine halbe Stunde lang geärgert hatte. Ich hatte einige frühere Swift-Klassen in ein aktuelles Projekt importiert, aber offensichtlich noch nicht die älteren Klassen zum Testziel hinzugefügt. Aber die automatische Vervollständigung brachte mich dazu zu denken, dass alles in Ordnung war ... bis ich versuchte zu bauen und zu rennen. Was zum...! Vielen Dank.
Jim Hillhouse
2
Dies löste das Problem auch für mich. Ich hatte auf eine Datei geklickt und eine Kopie davon dupliziert. Das neue Exemplar wurde aufgelistet, aber nicht in die "Compile Sources" aufgenommen
Ron Myschuk
1
In meinem Fall hatte ich 3 Ziele ausgewählt (Projekt, UI & Unit-Tests), ich musste UI & Unit-Tests Ziele abwählen, um diesen Fehler zu
beheben
1
"Lösung natürlich ..." setzt voraus, dass der Leser versteht, wie das Testziel hinzugefügt wird. Für uns, die gerade erst mit Xcode anfangen, ist es kein "natürlich ..." Moment. Ich habe @ edwins Antwort positiv bewertet, als er Ihre Antwort beendet hat.
Michael
181

Dies wurde bereits von @Craig Otis beantwortet, aber das Problem wird verursacht, wenn die fraglichen Klassen nicht zu denselben Zielen gehören, normalerweise fehlt das Testziel. Stellen Sie einfach sicher, dass die folgenden Kontrollkästchen aktiviert sind.


Zielmitgliedschaft

Bearbeiten

Anzeigen der Zielmitgliedschaft. Wählen Sie Ihre Datei aus und öffnen Sie den Dateiinspektor (⌥ + ⌘ + 1) [ Option ] + [ Befehl ] + 1

detaillierte Beschreibung

Edwin
quelle
Ich bin mir nicht sicher, aber wenn ich das Ziel "TEST" deaktiviere (in diesem Fall YAWA-WeatherTest). es wurde ohne Fehler gebaut.
dellos
Können Sie bitte klären, wo in XCode diese Zielmitgliedschaft festgelegt werden soll? Ich kann mich nicht erinnern, es vorher gesehen zu haben. Vielen Dank.
Casey Perkins
2
Deaktivieren Sie in der Tat das Testziel, da wir deshalb in den Testprojekten "@testable import ..." verwenden.
zeichnete ..
Der Screenshot ist sehr hilfreich. Vielen Dank!
Michael
37

Puh, endlich diagnostiziert. Irgendwie befand sich die fehlerhafte Swift-Datei EditTaskPopoverController.swiftin zwei verschiedenen Erstellungsphasen.

Es war in Compile Sourcesrichtig, mit allen anderen Swift - Dateien, aber es war auch für einige sehr seltsamen Grund, in der Copy Bundle ResourcesPhase als auch zusammen mit allen meinen XIB und Bildressourcen.

Ich habe keine Ahnung, wie es dort hingekommen ist, aber das Entfernen aus der zusätzlichen Build-Phase hat das Problem behoben.

Craig Otis
quelle
Ich hatte das gleiche Problem, das sich herausstellte, weil ich github.com/kronenthaler/mod-pbxproj und swift verwendete. Ich hatte versehentlich swift zu den Typen als PBXResourcesBuildPhase anstelle von PBXSourcesBuildPhase in mod-pbxproj hinzugefügt
richy
2
Kamerad! Lebensretter, hat meinen Kopf darüber ruiniert. Prost
SparkyRobinson
27

Im XCode-Menü hat Produkt-> Reinigen und dann Produkt-> Erstellen für mich funktioniert. Dieses Problem trat auf, als ich meinem Projekt in einer neuen Gruppe / einem neuen Ordner einen neuen ViewController hinzufügte.

Array
quelle
5
2 Stunden, und ich hätte nie gedacht, auf die Build-Schaltfläche zu klicken, um das Framework nach der Installation eines Pods zu integrieren ... Ich werde jetzt gehen ...
Cruceo
1
Verschwenden Sie viel Zeit, indem Sie andere Antworten ausprobieren, aber nie reinigen und bauen. Vielen Dank
Zeero0
Ich hatte diesen Fehler beim Spielen mit SwiftUI in Xcode 11.0 Beta 5, während ich dem Apple-Tutorial folgte. Auf der Zeichenfläche wurden andere Dateien ordnungsgemäß angezeigt, aber eine neu hinzugefügte Datei löste diesen Fehler aus und sagte, LandmarkRow_Previews sei ein nicht deklarierter Typ. Nur der Build Clean hat das Problem behoben.
salo.dm
Diese Antwort entspricht der technischen Unterstützung: "Haben Sie versucht, Ihr Gerät neu zu starten?" Ein guter Tipp :)
am
14

Ich hatte genau das gleiche Problem. Einige der Dateien in meinem Framework waren von anderen Klassen innerhalb desselben Moduls nicht erreichbar.

Aus irgendeinem Grund waren die Dateien, die dem Framework in Xcode hinzugefügt wurden, nicht Teil der Kompilierungsquellen. Wenn Ihre Swift-Datei nicht Teil der Kompilierungsquellen ist, müssen Sie sie hinzufügen, indem Sie auf das + tippen und sie im Popup auswählen.

Screenshot 1

Stellen Sie außerdem sicher, dass die Datei Teil des Framework-Ziels ist. (Das Kästchen im Screenshot unten sollte aktiviert sein.)

Screenshot 2

Groot
quelle
12

Die Ursache für mich war ein Funktionsname, der mit denselben Zeichen wie ein Typ begann:

@IBOutlet weak var tableView: CustomTableView!

und in der Implementierung hatte ich eine Funktion, die mit CustomTableView begann

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

Das Update bestand darin, die Funktionssignatur so zu ändern, dass sie nicht mit denselben Zeichen wie der Typ (CustomTableView) beginnt, z.

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

Dies war in meinem Fall eine sehr irreführende Fehlermeldung für die eigentliche Ursache.

Andrew
quelle
1
Vielen Dank für die Veröffentlichung dieses Fixes Andrew, es war eine große Hilfe. Die Fehlermeldung ist sicherlich irreführend.
JJC99
7

Falls jemand auf ein ähnliches Problem stößt, der Fix Compile Sources das Problem jedoch nicht löst, kann es sein, dass Xcode neu gestartet wird (es hat bei mir funktioniert). Meine Version von Xcode ist Version 6.1 (6A1052d).

Lindon Fox
quelle
Der Neustart hat bei mir funktioniert, obwohl der Fehler nach einem erfolgreichen Build ohne weitere Codeänderungen erneut aufgetreten ist.
Gelegentlich
Durch den Neustart von Xcode werden so viele Probleme behoben, dass Apple wirklich etwas dagegen unternehmen sollte.
Forge
5

In meiner App habe ich App-Delegaten und andere Klassen, auf die die Tests als öffentlich zugreifen müssen. Wie hier beschrieben , importiere ich dann meine App in meine Tests.

Als ich kürzlich zwei neue Klassen erstellt habe, waren ihre Testziele sowohl der Haupt- als auch der Testteil. Das Problem wurde behoben, indem sie aus ihrer Mitgliedschaft aus den Tests entfernt wurden.

Nate Uni
quelle
5

In meinem Fall enthielten die Kompilierungsquellen des TestTargets Dateien vom Hauptziel .

Ref :

Testziel enthält Dateien vom Hauptziel auf der Registerkarte Quellen kompilieren

Warum passiert das?

  • Dies geschieht, da wir beim Erstellen der Datei die TestTarget-Zuordnung überprüfen

  • Oder aktivieren Sie diese Option manuell im Inspektor.

    Ref :

    Datei erstellen - Testziel ist aktiviert

Wie habe ich gelöst?

  • Ich habe die Dateien des Hauptziels aus der Kompilierungsquelle von Test Target entfernt
Ratz
quelle
5

Manchmal können Fehler sehr dumm sein

Stellen Sie vor dem Überprüfen aller Lösungen hier oben sicher, dass Sie alle grundlegenden Dinge importiert haben

     import Foundation
     import UIKit

Es ist durchaus möglich, dass Sie beim Importieren einiger Dateien von außerhalb in Ihr Projekt diese grundlegenden Dinge übersehen, wie ich sie einmal erlebt habe.

Suraj K Thomas
quelle
Es ist mir für CLLocationManagerDelegate passiert und alles, was ich tun musste, war CoreLocation in diese andere Datei zu importieren, wie zum Beispiel, warum ich 20 Minuten verschwendet habe.
Derek
4

Ich habe viele der hier angebotenen Lösungen ausprobiert, aber schließlich die Datei gelöscht und erneut erstellt, und Xcode wurde besänftigt: /

Yusuf X.
quelle
Das hat auch bei mir funktioniert. Die Referenz wurde entfernt, bereinigt, erstellt und die Datei erneut hinzugefügt.
und
DANKE! Das ist ziemlich bizarr. Ich habe auch nur für mich gearbeitet. Gelöschter alter, kopierter alter Code in neue Datei, musste nicht einmal bereinigt / erstellt werden.
Timman
4

Dies kann auch passieren, wenn Sie versehentlich den Parameternamen groß schreiben und ihn wie das Objekt aufrufen.

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

Dies könnte jemandem helfen.

Ich habe mit Core Data ein neues Testprojekt namens "CoreData" erstellt. In Kürze habe ich "Verwendung von nicht deklariertem Typ" für NSManagedObjectContext und andere Core Data-Klassen. Nach mehreren Versuchen des Importierens, Hinzufügens zu Build-Phasen usw. habe ich das Projekt gelöscht und ein neues mit dem Namen "TestingCoreData" gestartet, und alles hat gut funktioniert.

Benennen (testen) Sie keine Projekte wie den Namen der Klassen

Babac
quelle
3

Dies kann auch passieren, wenn Ihre Signatur eine Funktion mit demselben Namen wie ein Objekttyp enthält. Beispielsweise:

class func Player(playerObj: Player)

Dies führt dazu, dass der Compiler verwirrt wird (und das zu Recht), da der Compiler zuerst lokal in der Datei sucht, bevor er andere Dateien betrachtet. Es schaut also auf "Player" in der Signatur und denkt, das ist kein Objekt in diesem Bereich, sondern eine Funktion, also stimmt etwas nicht.

Vielleicht ist dies ein guter Grund, warum ich Klassenfunktionen nicht groß schreiben sollte. :) :)

Maxwell
quelle
3

Ich habe diese Fehlermeldung in Xcode 8 erhalten, als ich Code in ein Framework umgestaltet habe. Es hat sich herausgestellt, dass ich vergessen habe, die Klasse im Framework als zu deklarieren public

tsuchi.one
quelle
2

Vielleicht haben Sie eine Klasse mit "FirstNameClass" hinzugefügt und danach manuell in "ColoredDotView" umbenannt. Versuchen Sie, den Inhalt der Klasse "ColoredDotView" in die Zwischenablage zu kopieren, entfernen Sie "ColoredDotView" aus dem Projekt und fügen Sie agin hinzu.

Diese ID behebt ein ähnliches Problem von mir.

Almin
quelle
2

In meinem Fall war ein Fehler von mir gemacht. Ich habe eine neue Datei als "OS X> Quelle> Kakaoklasse" anstelle von "iOS> Quelle> Kakao-Touch-Klasse" hinzugefügt.

Javier Calatrava Llavería
quelle
2

In meinem Fall wurde dies dadurch verursacht, dass in der nächsten Zeile ein Unterklassenname als Variablenname mit einem anderen Typ verwendet wurde:

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

Beachten Sie, dass in Zeile 1 pipGlow der Name der Unterklasse (von SKShapeNode) ist, in Zeile zwei jedoch pipGlow als Variablennamen verwendet habe. Dies war nicht nur ein schlechter Codierungsstil, sondern anscheinend auch ein absolutes Nein-Nein! Sobald ich die zweite Zeile in:

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

Ich habe den Fehler nicht mehr erhalten. Ich hoffe das hilft jemandem!

Zeeple
quelle
2

Stellen Sie beim Testen von Swift-Code, der zur Anwendung gehört, zunächst sicher, dass das Testziel die Anwendung als Abhängigkeit erstellt. Importieren Sie dann in Ihrem Test die Anwendung als Modul. Beispielsweise:

@testable import MyApplication

Dadurch werden die Swift-Objekte, die Teil der Anwendung sind, für den Test verfügbar.

quellish
quelle
2

In meinem Fall wurde dies durch die Textcodierung von schnellen Dateien verursacht. Eine Datei zeigte 'Keine explizite Codierung' und nach der Konvertierung in 'UTF-8' wurde das Problem behoben.

Und der Grund, warum die Textcodierung der Datei nicht explizit ist, ist, dass ich den gesamten Code aus einer anderen schnellen Datei kopiert habe.

Kein expliziter Codierungs-Screenshot

Geben Sie hier die Bildbeschreibung ein

UTF-8 Screenshot

Geben Sie hier die Bildbeschreibung ein

Jirui
quelle
2

Das Reinigen des Projekts hat mein Problem gelöst.

Schritte: Produkt -> Reinigen (oder Umschalt + Befehlstaste + K)

Anshul Tiwari
quelle
1

In meinem Fall wollte ich eine Methode mit einem benutzerdefinierten schnellen Objekt als Typparameter hinzufügen, und der Name, den ich der Variablen im Parameter gab, war genau der gleiche wie der Name der benutzerdefinierten Objektklasse

Die Probleme waren ungefähr so:

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

Der fett gedruckte Teil verursachte den Fehler eines nicht deklarierten Typs

cmario
quelle
1

wie andere gut erwähnt und in diesem Thread

Verwendung nicht benötigter schneller Dateien in "Bundle-Ressourcen kopieren" Screenshot zum Helfen

Hamed Nova
quelle
1

Wie bei anderen war es ein nicht verwandter Code, der @testablezu Fehlfunktionen führte.

In meinem Testziel gab es eine Objective-C-Header-Datei, die hatte

@import ModuleUnderTest;

Ich entfernte diese Zeile (weil der Import eigentlich unnötig war) und fing auf wundersame Weise @testablewieder an zu arbeiten.

Ich konnte dies nur aufspüren, aber alles aus meinem Projekt entfernen und Stück für Stück wieder hinzufügen, bis es fehlschlug. Schließlich fand ich die Problemcodezeile.

Oliver Pearmain
quelle
1

wenn Sie es aus verschiedenen zugreifen moduleoder Targetdann müssen Sie nur es publices

Sultan Ali
quelle
1

Für den Fall, dass jemand den gleichen dummen Fehler macht, den ich gemacht habe ...

Ich habe diesen Fehler erhalten, weil ich beim Umbenennen meiner Quelldatei versehentlich die Datei .aus dem Dateinamen entfernt habe und der Compiler die Datei daher als reine Textdatei und nicht als zu kompilierende Quelle behandelt hat.

Also wollte ich die Datei umbenennen, habe sie MyProtocol.swift aber versehentlich benannt MyProtocolswift

Es ist ein einfacher Fehler, aber es war nicht ohne weiteres offensichtlich, dass dies der Fall war.

Marc Renaud
quelle
1

Das Nicht-Hinzufügen der richtigen Import-Delkaration kann ebenfalls ein offensichtlicher Fehler sein. Für mich hatte ich es einfach unterlassen, PriorityUIKit zu importieren.

Stempel
quelle
1

Meine Situation ist, dass ich eine neue Datei XXView.swift in das Projekt ziehe. Und deklarieren Sie einen View-Typ als XXView, dann den Fehler "Verwendung eines nicht deklarierten Typs ....".

Ich versuche nur, meine XXView.swift zum Testziel hinzuzufügen, mit dem der Fehler behoben wurde. Aber ich wollte nicht, dass meine UI-Klasse in das Testziel einbezogen wird.

Schließlich fand ich meinen ViewController bereits im Testziel, was nicht passieren sollte. (Ich denke, da ich die VC daher mit einer xctemplate erstelle, wird sie automatisch in das Testziel aufgenommen.)

Ich entferne den View Controller vom Testziel, und dann muss mein XXView nicht mehr zum Testziel hinzugefügt werden.

Fazit: Stellen Sie sicher, dass alle zugehörigen Dateien auch das Testziel deaktivieren.

Wangdu Lin
quelle
1

Nachdem ich eine Stunde mit diesem Fehler verbracht hatte, stellte ich fest, dass die Moduldatei dupliziert wurde. Löschen Sie die zusätzliche Datei und verschieben Sie + cmd + k, um sie zu bereinigen. Der Fehler ist behoben.

Alirza Eram
quelle
Das mag eine dumme Frage sein, aber können Sie mehr darüber erklären? Geschieht dies auch bei doppelten schnellen Dateien oder bei doppelten Gruppen usw.? Es hat funktioniert, aber ich möchte mehr darüber wissen, warum es funktioniert, als nur zu akzeptieren, dass es funktioniert. Danke übrigens für die Lösung!
Cody Vollrath
1

In meinem Fall lag das Problem darin, dass ein neues classnicht erkannt wurde. Ich habe das Problem gelöst, indem ich die Klasse gelöscht und erneut hinzugefügt habe, diesmal jedoch die Watch App ExtensionOption beim Erstellen der neuen Klasse aktiviert habe.

Geben Sie hier die Bildbeschreibung ein

Bitte beachten Sie, dass meine Anwendung eine Watch App-Erweiterung enthält.

fs_tigre
quelle
Danke und in meinem Fall musste ich auch nur die Datei richtig hinzufügen Target.
Coletrain