Ich habe einen Typ in meinem Modul:
import Cocoa
class ColoredDotView : NSView {
...
}
Es wird in einer Reihe verschiedener Klassen ohne Probleme verwendet:
class EditSubjectPopoverController : NSObject {
@IBOutlet internal var subjectColorDotView : ColoredDotView!
...
}
Aber aus einem bestimmten Grund habe ich bei der Verwendung in einer spezifischen Klasse Kompilierungsfehler beim 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 ist:
EditTaskPopoverController.Swift: 15: 49: Verwendung des nicht deklarierten Typs 'ColoredDotView'
Was ich nicht verstehe Es ist der erste Kompilierungsfehler in der Datei, und alle anderen Fehler sind symptomatisch für den ersten. Weiterhin gibt es keine anderen Dateien mit Kompilierungsfehlern. Ich verstehe nicht, warum der Typ nicht deklariert ist, da sich die Datei im selben Modul befindet:
Ich habe versucht, das Projekt zu säubern, den Build-Ordner zu säubern und Xcode neu zu starten, ohne Erfolg. Welche möglichen Fehltritte können einen undeclared type
-Compilerfehler in Swift verursachen?
Puh, diagnostizierte das schließlich. Irgendwie befand sich die beanstandete Swift-Datei EditTaskPopoverController.Swift
in zwei verschiedenen Buildphasen.
Es befand sich in Compile Sources
korrekt mit allen anderen Swift-Dateien, aber es war auch aus einem sehr seltsamen Grund in der Copy Bundle Resources
-Phase, zusammen mit all meinen XIB- und Image-Ressourcen.
Ich habe keine Ahnung, wie es dorthin gekommen ist, aber das Entfernen des Problems aus der zusätzlichen Erstellungsphase hat das Problem behoben.
Ich bin auf diesen Fehler gestoßen, als mein Testziel nicht über einige Swift-Dateien verfügte, die mein App-Build-Ziel in Kompilierquellen hatte. Es war sehr verwirrend, weil der "nicht deklarierte Typ" an so vielen anderen Stellen problemlos verwendet wurde und der Fehler vage aussah. Die Lösung bestand natürlich darin, die Datei, die den nicht deklarierten Typ enthält, zum Testziel hinzuzufügen.
Dies wurde bereits von @Craig Otis beantwortet, das Problem liegt jedoch vor, wenn die betreffenden Klassen nicht zu denselben Zielen gehören und das Testziel normalerweise fehlt. Stellen Sie nur sicher, dass die folgenden Kontrollkästchen aktiviert sind.
Um die Zielmitgliedschaft zu sehen. Wählen Sie Ihre Datei aus und öffnen Sie den Datei-Inspector (⌥ + ⌘ + 1) [ Option ] + [ Befehl ] + 1
Im XCode-Menü klappte Product-> Clean und dann Product-> Build für mich. Dieses Problem ist aufgetreten, als meinem Projekt in einer neuen Gruppe/einem neuen Ordner ViewController hinzugefügt wurde.
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 beginnt
func CustomTableView(tableView: CustomTableView, dataForRow row: Int) -> NSData {...}
Das Update bestand darin, die Funktionssignatur so zu ändern, dass sie nicht mit den gleichen Zeichen wie der Typ (CustomTableView) begann, z. B .:
func dataForRow(row: Int, tableView: CustomTableView) -> NSData {...}
Dies war in meinem Fall eine sehr irreführende Fehlermeldung für die tatsächliche Ursache.
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 in Xcode zum Framework hinzugefügt wurden, nicht Teil der Compile-Quellen. Wenn Ihre Swift-Datei nicht Teil der Compile-Quellen ist, müssen Sie sie hinzufügen, indem Sie auf das + tippen und sie im Popup auswählen.
Stellen Sie außerdem sicher, dass die Datei Teil des Framework-Ziels ist. (Das kleine Kästchen im Screenshot sollte markiert sein)
In meiner App habe ich App-Delegierte 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 Hauptteil als auch der Testteil. Durch das Entfernen der Mitglieder aus den Testmitgliedern wurde das Problem behoben.
Falls jemand auf ein ähnliches Problem stößt, aber der Compile Sources Fix das Problem nicht löst, kann ein Neustart von Xcode auftreten (es hat bei mir funktioniert). Meine Version von Xcode ist Version 6.1 (6A1052d)
.
Dies kann auch passieren, wenn Sie versehentlich den Parameternamen großschreiben und ihn wie das Objekt nennen.
class func didRecieveData(BlockItems: [BlockItems])
Dies kann auch passieren, wenn Sie in Ihrer Signatur eine Funktion mit demselben Namen wie ein Objekttyp haben. Zum Beispiel:
class func Player(playerObj: Player)
der Compiler wird verwirrt (und das zu Recht), da der Compiler zuerst lokal in der Datei nachschaut, bevor er sich andere Dateien ansieht. Also schaut es sich "Player" in der Signatur an und meint, das ist kein Objekt in diesem Bereich, sondern eine Funktion, also stimmt etwas nicht.
Vielleicht ist das ein guter Grund, warum ich Klassenfunktionen nicht kapitalisieren sollte. :)
Ich habe viele der hier angebotenen Lösungen ausprobiert, aber schließlich die Datei gelöscht und erneut erstellt, und Xcode wurde besänftigt: /
Das könnte jemandem helfen.
Ich habe ein neues Testprojekt mit Core Data namens "CoreData" erstellt. In Kürze habe ich "Verwendung von nicht deklariertem Typ" für NSManagedObjectContext und andere Core Data-Klassen erhalten. Nach mehreren Versuchen des Importierens, Hinzufügen zu Build-Phasen usw. habe ich das Projekt gelöscht und ein neues mit dem Namen "TestingCoreData" gestartet.
Nicht benennen (testen) Projekte wie Name der Klassen
Ich habe diese Fehlermeldung in Xcode 8 erhalten, als ich den Code in ein Framework umwandelte. Ich habe vergessen, die Klasse im Framework als public
zu deklarieren.
In meinem Fall wurde dies durch einen Unterklassennamen verursacht, der in der nächsten Zeile als Variablenname mit einem anderen Typ verwendet wurde:
var binGlow: pipGlow = pipGlow(style: "Bin")
var pipGlow: PipGlowSprite = PipGlowSprite()
Beachten Sie, dass pipGlow in Zeile 1 der Name der Unterklasse (von SKShapeNode) ist, aber in Zeile 2 habe ich pipGlow als Variablennamen verwendet. Dies war nicht nur ein schlechter Codierstil, sondern anscheinend auch ein absolutes No-No! Sobald ich die zweite Zeile geändert habe:
var binGlow: pipGlow = pipGlow(style: "Bin")
var pipGlowSprite: PipGlowSprite = PipGlowSprite()
Ich habe den Fehler nicht mehr erhalten. Ich hoffe das hilft jemandem!
Stellen Sie beim Testen des zur Anwendung gehörenden Swift-Codes sicher, dass das Testziel die Anwendung als Abhängigkeit erstellt. Anschließend importieren Sie die Anwendung in Ihrem Test als Modul. Zum Beispiel:
@testable import MyApplication
Dadurch werden die Swift-Objekte, die Teil der Anwendung sind, für den Test verfügbar.
In meinem Fall enthielten die Kompilierungsquellen des TestTargets Dateien vom Hauptziel .
Ref:
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:
Wie habe ich aufgelöst?
In meinem Fall wurde ein Fehler von mir gemacht. Ich habe eine neue Datei als "OS X> Source> Cocoa Class" statt "iOS> Source> Cocoa Touch Class" hinzugefügt.
Das Projekt zu reinigen löste mein Problem.
Schritte: Produkt -> Reinigen (oder Umschalt + Befehlstaste + K)
Das Nicht-Hinzufügen der korrekten Importanmeldung kann ebenfalls ein offensichtlicher Fehlschlag sein. Für mich hatte ich den Import von Priority UIKit einfach unterlassen.
Wie auch bei anderen war es ein nicht zusammenhängender Code, der zu einer Fehlfunktion des @testable
führte.
In meinem Testziel befand sich eine Objective-C-Header-Datei mit
@import ModuleUnderTest;
Ich entfernte diese Zeile (weil der Import eigentlich unnötig war) und @testable
begann auf wundersame Weise wieder zu funktionieren.
Ich konnte dies nur feststellen, aber alles aus meinem Projekt entfernen und Stück für Stück hinzufügen, bis es fehlschlug. Schließlich fand ich die problematische Codezeile.
Manchmal können Fehler sehr dumm sein
Vergewissern Sie sich, dass Sie alle grundlegenden Elemente importiert haben, bevor Sie alle hier aufgeführten Lösungen überprüfen
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.
In meinem Fall wurde dies durch die Textcodierung von Swift-Dateien ..__ verursacht. In einer Datei wurde 'No Explicit Encoding' (Keine explizite Codierung) angezeigt. 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 Swift-Datei kopiert habe.
Kein expliziter Encoding-Screenshot
UTF-8-Screenshot
In meinem Fall wollte ich eine Methode mit einem benutzerdefinierten Swift-Objekt als Typparameter hinzufügen, und der Name, den ich der Variablen im Parameter gab, entsprach genau dem Namen der benutzerdefinierten Objektklasse
Das Problem war ungefähr so:
func moveBlob(**blob** : blob){
...code
}
Der Teil in fett hat den Fehler des nicht deklarierten Typs verursacht
wenn Sie von verschiedenen module
oder Target
darauf zugreifen, benötigen Sie es nur für public
Möglicherweise haben Sie eine Klasse mit einigen "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 ein neues hinzu.
Diese ID behebt ein ähnliches Problem von mir.
wie schon andere gut erwähnt und in diesem Thread
verwendung nicht benötigter Swift-Dateien in "Ressourcenpakete kopieren"
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, mein XXView.Swift zum Testziel hinzuzufügen, wodurch der Fehler behoben wurde. Aber ich wollte nicht, dass meine UI-Klasse in das Testziel einbezogen wird.
Schließlich habe ich meinen ViewController bereits im Testziel gefunden, was nicht passieren sollte. (Ich denke, da ich das VC durch ein xctemplate erstelle, wird es automatisch in das Testziel aufgenommen)
Ich entferne den Ansichtscontroller 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.
Falls jemand den gleichen dummen Fehler macht wie ich ...
Ich habe diese Fehlermeldung erhalten, weil ich beim Umbenennen meiner Quelldatei versehentlich den .
aus dem Dateinamen entfernt habe. Der Compiler behandelte die Datei daher als reine Textdatei und nicht als zu kompilierende Quelle.
also wollte ich die Datei in MyProtocol.Swift
umbenennen, aber aus Versehen den Namen MyProtocolswift
Es ist ein einfacher Fehler, aber es war nicht offensichtlich, dass dies der Fall war.