"Uso de tipo no declarado" en Swift, aunque el tipo es interno y existe en el mismo módulo

173

Tengo un tipo en mi módulo:

import Cocoa

class ColoredDotView : NSView {
   ...
}

Se utiliza en varias clases diferentes sin problemas:

class EditSubjectPopoverController : NSObject {

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

Pero por alguna razón , cuando lo uso en una clase específica , tengo errores de compilación en el 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...
    ...
}

El error de compilación es:

EditTaskPopoverController.swift: 15: 49: Uso del tipo no declarado 'ColoredDotView'

Lo cual no entiendo. Es el primer error de compilación en el archivo, y el resto de los errores son sintomáticos del primero. Además, no hay otros archivos con errores de compilación. No entiendo por qué el tipo no está declarado, ya que el archivo está en el mismo módulo:

ingrese la descripción de la imagen aquí

Intenté limpiar el proyecto, limpiar la carpeta de compilación y reiniciar Xcode, pero fue en vano. ¿Qué posibles errores pueden causar un undeclared typeerror del compilador en Swift?

Craig Otis
fuente
He tenido muchos casos en los que el error real es unas pocas líneas (o más) más abajo, y Xcode erróneamente etiqueta algo inocuo con un mensaje de error. Vea si puede eliminar ese error borrando el resto de su código, luego agréguelo poco a poco ...
Nate Cook
Gracias Nate, desafortunadamente elimino las vardeclaraciones y llego a una compilación pasajera. Luego agrego una de las declaraciones en la parte superior, y el error vuelve inmediatamente: imgur.com/VUUBK2K
Craig Otis

Respuestas:

200

Para mí, encontré este error cuando mi objetivo de prueba no tenía algunos archivos rápidos que mi objetivo de compilación de aplicaciones tenía en las fuentes de compilación. Fue muy confuso porque el 'tipo no declarado' se estaba utilizando en muchos otros lugares sin ningún problema, y ​​el error parecía vago. Entonces, la solución era, por supuesto, agregar el archivo que contiene el 'tipo no declarado' al objetivo de la prueba.

mattorb
fuente
2
Lo mismo para mí: ¡el problema ocurre cuando una clase utilizada por otra incluida en el objetivo de prueba, no está incluida en el objetivo de prueba también! (╯ ° □ °) ╯︵ ┻━┻
Francesco Vadicamo
2
Acabas de resolver un problema que me había molestado durante media hora. Importé algunas clases anteriores de Swift en un proyecto actual, pero obviamente aún no había agregado las clases más antiguas al objetivo de prueba. Pero el autocompletado me hizo pensar que todo estaba bien ... hasta que intenté construir y ejecutar. Que...! Muchas gracias.
Jim Hillhouse
2
Esto resolvió el problema para mí también. Hice clic en un archivo y file-> dupliqué una copia del mismo. La nueva copia fue incluida pero no incluida en las "fuentes de compilación"
Ron Myschuk
1
En mi caso, había seleccionado 3 objetivos (Proyecto, UI y pruebas de Unidad), tuve que anular la selección de los objetivos de prueba de UI y Unidad para resolver este error
Frakcool
1
"Solución, por supuesto ..." supone que el lector comprende cómo agregar el objetivo de prueba. Para nosotros recién comenzando con Xcode, no es un momento "por supuesto ...". Voté por la respuesta de @ edwin cuando terminó su respuesta.
Michael
181

Esto ya ha sido respondido por @Craig Otis, pero el problema se produce cuando las clases en cuestión no pertenecen a los mismos objetivos, generalmente falta el objetivo de prueba. Solo asegúrese de que las siguientes casillas estén marcadas.


membresía objetivo

Editar

Para ver la membresía objetivo. Seleccione su archivo y luego abra el inspector de archivos (⌥ + ⌘ + 1) [ opción ] + [ comando ] + 1

Descripción detallada

Edwin
fuente
No estoy seguro, pero cuando desactivo el objetivo "TEST" (en este caso es YAWA-WeatherTest). Se construyó sin error.
dellos
¿Puede aclarar en qué lugar de XCode establecer esta Membresía de destino? No recuerdo haberlo visto antes. Gracias.
Casey Perkins el
2
De hecho, desmarque el objetivo de la prueba, ya que es por eso que "@testable import ..." en los proyectos de prueba.
dibujó ..
La captura de pantalla es muy útil. ¡Gracias!
Michael
37

Uff, finalmente diagnosticó esto. De alguna manera , el archivo Swift ofensivo EditTaskPopoverController.swiftestaba en dos fases de compilación diferentes.

Estaba Compile Sourcescorrectamente, con todos los demás archivos Swift, pero también , por alguna razón muy extraña, también en la Copy Bundle Resourcesfase, junto con todos mis recursos XIB y de imagen.

No tengo idea de cómo llegó allí, pero eliminarlo de la fase de construcción adicional resolvió el problema.

Craig Otis
fuente
Resultó que tenía el mismo problema, porque estaba usando github.com/kronenthaler/mod-pbxproj y swift, accidentalmente agregué swift a los tipos como PBXResourcesBuildPhase en lugar de PBXSourcesBuildPhase en mod-pbxproj
richy
2
¡Compañero! Salvavidas, me estaba destrozando la cabeza por esto. Saludos
SparkyRobinson
27

En el menú XCode Producto-> Limpiar y luego Producto-> Construir funcionó para mí. Encontré este problema cuando agregué un nuevo ViewController a mi proyecto en un nuevo Grupo / Carpeta.

Formación
fuente
55
2 horas, y nunca pensé hacer clic en el botón de compilación para incorporar el marco después de instalar un pod ... Me iré ahora ...
Cruceo
1
Perdí mucho tiempo probando otras respuestas pero nunca las limpié y construí. Muchas gracias
Zeero0
Tuve este error al jugar con SwiftUI en Xcode 11.0 beta 5, mientras seguía el tutorial de Apple. El lienzo mostraba correctamente otros archivos, pero un archivo recién agregado arrojó este error, diciendo que LandmarkRow_Previews era un tipo no declarado. Solo la compilación Clean solucionó el problema.
salo.dm
Esta respuesta es equivalente a la asistencia técnica: "¿Has intentado reiniciar tu dispositivo?" Un buen consejo :)
Turingtested
14

Tuve exactamente el mismo problema. Algunos de los archivos en mi marco no eran accesibles desde otras clases dentro del mismo módulo.

Por alguna razón, los archivos que se habían agregado al marco en Xcode no formaban parte de las fuentes de compilación. Si su archivo Swift no es parte de las fuentes de compilación, debe agregarlos tocando el + y seleccionándolos en la ventana emergente.

Captura de pantalla 1

También asegúrese de que el archivo sea parte del objetivo del marco. (La pequeña casilla en la captura de pantalla a continuación debe estar marcada)

Captura de pantalla 2

Groot
fuente
12

La causa para mí fue un nombre de función que comenzó con los mismos caracteres que un tipo:

@IBOutlet weak var tableView: CustomTableView!

y en la implementación tenía una función que comenzaba con CustomTableView

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

La solución fue cambiar la firma de la función para que no comenzara con los mismos caracteres que el tipo (CustomTableView), por ejemplo:

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

Este fue un mensaje de error muy engañoso para la causa real en mi caso.

Andrés
fuente
1
Muchas gracias por publicar esta solución Andrew, fue de gran ayuda. El mensaje de error es ciertamente engañoso.
jjc99
7

En caso de que alguien encuentre un problema similar pero la solución Compile Sources no resuelva el problema, reiniciar Xcode puede (funcionó para mí). Mi versión de Xcode es Version 6.1 (6A1052d).

lindon fox
fuente
El reinicio funcionó para mí, aunque el error apareció nuevamente después de una compilación exitosa, sin más cambios en el código.
Poco frecuentes el
Reiniciar Xcode soluciona tantos problemas que Apple realmente debería hacer algo al respecto.
Forge
5

En mi aplicación tengo delegado de aplicaciones y otras clases a las que las pruebas deben acceder como públicas. Como se describe aquí , luego importo mi aplicación en mis pruebas.

Cuando recientemente creé dos nuevas clases, sus objetivos de prueba eran las partes principales y de prueba. Eliminarlos de su membresía de las pruebas resolvió el problema.

Nate Uni
fuente
5

En mi caso, las fuentes de compilación de TestTarget tenían archivos del objetivo principal .

Ref :

Test Target contiene archivos del objetivo principal en la pestaña de fuentes de compilación

¿Por qué pasa esto?

  • Esto sucede porque verificamos la asociación TestTarget al crear el archivo

  • O marcando manualmente esta opción del inspector.

    Ref :

    Crear archivo: el objetivo de prueba está marcado

¿Cómo lo resolví?

  • Eliminé los archivos del objetivo principal de la fuente de compilación de Test Target
Ratz
fuente
5

A veces los errores pueden ser muy tontos

Antes de verificar todas las soluciones aquí, asegúrese de haber importado todas las cosas básicas

     import Foundation
     import UIKit

Es muy posible que al importar algunos archivos desde el exterior a su proyecto, lo que puede pasar por alto estas cosas básicas como lo experimenté una vez.

Suraj K Thomas
fuente
me sucedió para CLLocationManagerDelegate y todo lo que tuve que hacer fue importar CoreLocation en este otro archivo como ugh por qué perdí 20 minutos.
Derek
4

Probé muchas de las soluciones ofrecidas aquí, pero finalmente eliminé el archivo y lo volví a crear, y Xcode se aplacó: /

Yusuf X
fuente
Esto funcionó para mí también. Se eliminó la referencia, se limpió, se compiló y luego se volvió a agregar el archivo.
andnil
¡GRACIAS! Esto es bastante extraño. También funcionó para mí también. El código antiguo copiado y eliminado en un archivo nuevo, ni siquiera tuvo que limpiar / compilar.
Timman
4

Esto también puede ocurrir si accidentalmente escribe en mayúscula el nombre del parámetro y lo llama igual que el objeto.

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

Esto podría ayudar a alguien.

He creado un nuevo proyecto de prueba con Core Data llamado "CoreData". En breve obtuve "Uso de tipo no declarado" para NSManagedObjectContext y otras clases de Core Data. Después de varios intentos de importar, agregar a las fases de compilación, etc. Eliminé el proyecto y comencé uno nuevo llamado "TestingCoreData" y todo funcionó bien.

No nombrar (probar) proyectos como el nombre de las clases

Babac
fuente
3

Esto también puede suceder si tiene una función con el mismo nombre que un tipo de objeto en su firma. Por ejemplo:

class func Player(playerObj: Player)

hará que el compilador se confunda (y con razón) ya que el compilador primero buscará localmente dentro del archivo antes de mirar otros archivos. Por lo tanto, mira "Player" en la firma y piensa que no es un objeto en este ámbito, sino una función, por lo que algo está mal.

Quizás esta sea una buena razón por la que no debería capitalizar las funciones de clase. :)

Maxwell
fuente
3

Recibí este mensaje de error en Xcode 8 al refactorizar el código en un marco, resulta que olvidé declarar la clase en el marco como public

tsuchi.one
fuente
2

Tal vez haya agregado clase con alguna "FirstNameClass" y luego cambie el nombre manualmente a "ColoredDotView". Intente copiar el contenido de la clase "ColoredDotView" al portapapeles, elimine "ColoredDotView" del proyecto y agregue agin.

Esta identificación solucionó un problema similar de mi parte.

Almin
fuente
2

En mi caso fue un error cometido por mí. Agregué un nuevo archivo como "OS X> Fuente> Cocoa Class", en lugar de "iOS> Fuente> Cocoa Touch Class".

Javier Calatrava Llavería
fuente
2

En mi caso, esto fue causado por el uso de un nombre de subclase en la siguiente línea como nombre de variable con un tipo diferente:

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

Observe que en la línea 1, pipGlow es el nombre de la subclase (de SKShapeNode), pero en la línea dos, estaba usando pipGlow como nombre de variable. ¡Esto no solo era un mal estilo de codificación, sino que aparentemente también era un no-no absoluto! Una vez que cambie la segunda línea a:

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

Ya no recibí el error. ¡Espero que esto ayude a alguien!

zeeple
fuente
2

Al probar el código Swift que pertenece a la aplicación, primero asegúrese de que el objetivo de la prueba esté creando la aplicación como una dependencia. Luego, en su prueba, importe la aplicación como un módulo. Por ejemplo:

@testable import MyApplication

Esto hará que los objetos Swift que forman parte de la aplicación estén disponibles para la prueba.

sofocante
fuente
2

En mi caso, eso fue causado por la codificación de texto de los archivos rápidos. Un archivo mostró 'Sin codificación explícita', y después de convertirlo a 'UTF-8', el problema se resolvió.

Y la razón por la cual la codificación de texto del archivo no es explícita es que copié todo el código de otro archivo rápido.

Captura de pantalla sin codificación explícita

ingrese la descripción de la imagen aquí

Captura de pantalla de UTF-8

ingrese la descripción de la imagen aquí

Jirui
fuente
2

Limpiar el proyecto resolvió mi problema.

Pasos: Producto -> Limpiar (o Shift + Cmd + K)

Anshul Tiwari
fuente
1

En mi caso, quería agregar un método con un objeto rápido personalizado como parámetro de tipo, y el nombre que le di a la variable en el parámetro era exactamente el mismo que el nombre de la clase de objeto personalizado

El problema era algo como esto:

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

La parte en negrita estaba causando el error de tipo no declarado

cmario
fuente
1

como otros mencionaron bien y en este hilo

uso de archivos rápidos innecesarios en "recursos de paquete de copia" captura de pantalla para ayudar

Hamed Nova
fuente
1

Al igual que otros, fue un código no relacionado que estaba causando el @testable mal funcionamiento.

En mi objetivo de prueba había un archivo de encabezado Objective-C que tenía

@import ModuleUnderTest;

Eliminé esta línea (porque la importación era realmente innecesaria) y milagrosamente @testablecomencé a trabajar nuevamente.

Solo pude rastrear esto, pero eliminé todo de mi proyecto y lo volví a agregar poco a poco hasta que falló. Finalmente encontré la línea de código problemática.

Oliver Pearmain
fuente
1

si se accede a ella desde diferentes moduleo Targeta continuación, sólo se necesita publicque

Sultan Ali
fuente
1

En caso de que alguien cometa el mismo error tonto que hice ...

Estaba recibiendo este error porque al renombrar mi archivo fuente, accidentalmente eliminé el. archivo del nombre del archivo, por lo que el compilador trató el archivo como un archivo de texto sin formato y no como fuente para compilar.

así que quise cambiar el nombre del archivo MyProtocol.swift pero accidentalmente lo llamé MyProtocolswift

Es un simple error, pero no era obvio que esto era lo que estaba pasando.

Marc Renaud
fuente
1

No agregar la delimitación de importación correcta también puede ser una falta obvia. Para mí, simplemente había omitido importar PriorityUIKit.

Sello
fuente
1

Mi situación es que arrastro un nuevo archivo XXView.swift al proyecto. Y declare que un tipo de Vista es XXView y luego el error "uso de tipo no declarado ...".

Solo trato de agregar mi XXView.swift al objetivo de prueba que resolvió el error. Pero no quería que mi clase de IU participara en el objetivo de la prueba.

Finalmente, encontré mi ViewController ya en el objetivo de prueba, lo que no debería suceder. (Creo que debido a que creo el VC mediante una plantilla xctemplate, se incluirá automáticamente en el objetivo de prueba)

Elimino el controlador de vista del objetivo de prueba, y luego mi XXView ya no es necesario agregar al objetivo de prueba.

Conclusión: asegúrese de que todos sus archivos relacionados también desmarquen el objetivo de prueba.

Wangdu Lin
fuente
1

Después de pasar una hora en este error, descubrí que el archivo del módulo está duplicado. elimine el archivo adicional y presione shift + cmd + k para limpiar y el error desaparecerá.

Alirza Eram
fuente
Esta puede ser una pregunta estúpida, pero ¿puedes explicar más sobre eso? ¿Esto sucede también con archivos rápidos duplicados, o grupos duplicados, etc.? Funcionó, pero me gusta saber más sobre por qué funciona que simplemente aceptar que funciona. Gracias por la solución por cierto!
Cody Vollrath
1

En mi caso, el problema era con un nuevo classno reconocido. Resolví el problema eliminando la clase y volviéndola a agregar, pero esta vez marcando la Watch App Extensionopción al crear la nueva clase.

ingrese la descripción de la imagen aquí

Tenga en cuenta que tengo una extensión de aplicación Watch en mi aplicación.

fs_tigre
fuente
Gracias y en mi caso también solo necesitaba agregar el archivo al correcto Target.
Coletrain