webentwicklung-frage-antwort-db.com.de

"Verwendung von nicht deklariertem Typ" in Swift, obwohl type intern ist und in demselben Modul vorhanden ist

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:

enter image description here

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?

136
Craig Otis

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.

31
Craig Otis

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.

166
mattorb

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.


target membership

Bearbeiten

Um die Zielmitgliedschaft zu sehen. Wählen Sie Ihre Datei aus und öffnen Sie den Datei-Inspector (⌥ + ⌘ + 1) [ Option ] + [ Befehl ] + 1

detailed description

153
Edwin

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.

16
Array

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.

11
Andrew

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.

Screenshot 1

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

Screenshot 2

11
Groot

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.

4
Nate Uni

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).

3
lindon fox

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

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

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. :)

2
Maxwell

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

2
Yusuf X

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

2
Babac

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.

2
tsuchi.one

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!

1
zeeple

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.

1
quellish

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

Ref:

 Test Target contains files from main target in compile sources tab 

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:

     Create File - Test Target is Checked 

Wie habe ich aufgelöst?

  • Ich habe die Dateien des Hauptziels aus der Compile-Quelle von Test Target entfernt
1
Ratz

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)

1
Anshul Tiwari

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.

0
Mississippi

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.

0
Oliver Pearmain

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.

0
Suraj K Thomas

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

 enter image description here

UTF-8-Screenshot

 enter image description here

0
Jirui

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

0
cmario

wenn Sie von verschiedenen module oder Target darauf zugreifen, benötigen Sie es nur für public

0
Sultan Ali

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.

0
Almin

wie schon andere gut erwähnt und in diesem Thread

verwendung nicht benötigter Swift-Dateien in "Ressourcenpakete kopieren"  screen shot for helping

0
nova

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.

0
Wangdu Lin

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.

0
Marc Renaud