即使类型是内部的,并且存在于同一模块中,在Swift中也“使用未声明的类型”


173

我的模块中有一个类型:

import Cocoa

class ColoredDotView : NSView {
   ...
}

它被用于许多不同的类中,没有问题:

class EditSubjectPopoverController : NSObject {

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

但是由于某种原因,当我在一个特定的类中使用它时,在类型上出现编译错误:

class EditTaskPopoverController : NSObject {

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

编译错误是:

EditTaskPopoverController.swift:15:49:使用未声明的类型'ColoredDotView'

我不明白。这是文件中的第一个编译错误,其余错误都是第一个的症状。此外,没有其他文件存在编译错误。我不明白为什么未声明类型,因为文件位于同一模块中:

在此处输入图片说明

我曾尝试清理项目,清理构建文件夹并重新启动Xcode,但无济于事。哪些潜在的失误会导致undeclared type Swift中编译器错误?


在很多情况下,实际错误在更下方几行(或更多)处,并且Xcode错误地将错误消息标记为无害的内容。看看是否可以通过删除其余代码来消除该错误,然后一点一点地添加回去...
— Nate Cook

谢谢Nate-不幸的是,我删除了var声明,然后通过了构建。然后,我在顶部添加一个声明,然后立即返回错误:imgur.com/VUUBK2K
— Craig Otis

Answers:


200

对我来说,当我的测试目标没有编译应用程序中的某些快速文件时,我会遇到此错误。这非常令人困惑,因为在许多其他地方都可以毫无问题地使用“未声明类型”,并且错误似乎很模糊。因此,解决方案当然是将包含“未声明类型”的文件添加到测试目标。


2
对我来说也一样:当Test目标中包含的另一个类使用的类也未包含在Test目标中时,就会出现问题!(╯°□°)╯(┻━┻
— 弗朗西斯Vadicamo

2
您刚刚解决了一个困扰我半个小时的问题。我已经将一些以前的Swift类导入到当前项目中,但是显然还没有将较早的类添加到测试目标中。但是自动补全让我觉得一切都很好……直到我尝试构建并运行。什么...!非常感谢你。
— Jim Hillhouse

2
这也为我解决了这个问题。我单击了一个文件,然后文件->复制了它的副本。列出了新副本,但未包括在“编译源”中
— 罗恩·米舒克

1
就我而言,我选择了3个目标(项目,UI和单元测试),为了解决此错误,我不得不取消选择UI和单元测试目标
— Frakcool

1
“当然是解决方案...”假定读者理解如何添加测试目标。对于我们刚开始使用Xcode来说,这不是“当然……”的时刻。当他完成您的回答时,我赞成@edwin的回答。
— 迈克尔

181

@Craig Otis已经回答了这个问题,但是问题是由于所涉及的类不属于同一目标,通常是缺少测试目标而引起的。只需确保选中以下复选框。


目标会员

编辑

查看目标会员资格。选择您的文件,然后打开该文件检查器(⌥+⌘+ 1)[ 选项 ] + [ 命令 ] + 1

详细说明


不确定,但是当我取消选中“ TEST”目标时(在本例中为YAWA-WeatherTest)。它建立没有错误。
— 2015年

您能否说明在XCode中的哪个位置设置此目标成员身份?我不记得以前见过它。谢谢。
— Casey Perkins 2015年

2
实际上,请取消选中测试目标,因为这就是我们在测试项目中“ @testable import ...”的原因。
— 画了..

屏幕截图非常有帮助。谢谢!
— 迈克尔(Michael

37

ew,终于诊断出来了。不知何故,令人讨厌的Swift文件EditTaskPopoverController.swift处于两个不同的构建阶段。

它Compile Sources与所有其他Swift文件都正确放置,但出于某些非常奇怪的原因,它也位于Copy Bundle Resources阶段以及与所有我的XIB和图像资源一起。

我不知道它是如何到达那里的,但是从额外的构建阶段中删除它可以解决此问题。


我有同样的问题就变成了,因为我用github.com/kronenthaler/mod-pbxproj和迅速,在MOD-pbxproj我不小心加迅速的类型,PBXResourcesBuildPhase代替PBXSourcesBuildPhase
— 里希

2
伴侣!救生员,为此感到震惊。干杯
— SparkyRobinson

27

在XCode菜单中,产品->清洁,然后产品->构建对我有用。在新的组/文件夹中向我的项目添加新的ViewController时遇到了这个问题。


5
2个小时,我从没想过要在安装Pod之后单击“构建”按钮来合并框架...我现在要离开...
— Cruceo

1
尝试其他答案浪费了很多时间,但从未清理和构建。非常感谢
— Zeero0

在遵循Apple教程的同时,在Xcode 11.0 beta 5中使用SwiftUI时遇到此错误。画布可以正确显示其他文件,但是新添加的文件引发了此错误,并指出LandmarkRow_Previews是未声明的类型。只是构建清理解决了问题。
— salo.dm

该答案等同于Tech支持人员:“您是否尝试过重启设备?” 一个不错的提示:)
— turingtested

14

我有同样的问题。同一模块中的其他类无法访问我框架中的某些文件。

由于某些原因,以Xcode添加到框架中的文件不属于“编译源”。如果您的Swift文件不属于编译源,则需要通过点击+并在弹出窗口中选择它们来添加它们。

屏幕截图1

还要确保该文件是框架目标的一部分。(下面的屏幕截图中的小方框应选中)

屏幕截图2


12

对我来说,原因是函数名称以与类型相同的字符开头:

@IBOutlet weak var tableView: CustomTableView!

在实现中,我有一个以CustomTableView开头的函数

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

解决方法是更改​​函数签名,以使其不以与类型(CustomTableView)相同的字符开头,例如:

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

对于我而言,这是一个很容易引起误解的错误消息。


1
非常感谢您发布此修复程序Andrew,这是一个很大的帮助。该错误消息肯定是令人误解的。
— jjc99 '16

7

如果有人遇到类似问题,但“ 编译源”修复程序无法解决问题,则可以重新启动Xcode(对我有用)。我的Xcode版本是Version 6.1 (6A1052d)。


重新启动对我有用,尽管在成功构建后错误再次弹出,而没有任何进一步的代码更改。
— 罕见

重新启动Xcode可以解决很多问题,Apple确实应该对此做些事情。
— 锻造

5

在我的应用程序中,我具有应用程序委托和测试需要作为公共访问的其他类。如此处概述,然后将我的应用程序导入测试中。

当我最近创建两个新类时,它们的测试目标既是主要部分,又是测试部分。从测试中将其从其成员资格中删除可以解决此问题。


5

就我而言,TestTarget的编译源中包含来自Main Target的文件。

参考:

测试目标包含“编译源”选项卡中主要目标的文件

为什么会这样呢?

  • 发生这种情况是因为我们在创建文件时检查了TestTarget关联

  • 或从检查器中手动检查此选项。

    参考:

    创建文件-检查目标

我如何解决?

  • 我从测试目标的编译源中删除了主要目标的文件

5

有时错误可能非常愚蠢

在这里检查所有解决方案之前,请确保已导入所有基本内容

     import Foundation
     import UIKit

当您从外部将一些文件导入到项目中时,很有可能会错过我曾经经历过的这些基本知识。


它发生在CLLocationManagerDelegate身上,而我要做的就是像这个其他文件上导入CoreLocation,为什么我要浪费20分钟。
— 德里克

4

我尝试了此处提供的许多解决方案,但最终删除了该文件并再次创建了它,Xcode被简化了:/


这也为我工作。删除了引用,对其进行了清理,构建,然后再次添加了文件。
— andnil

谢谢!这很奇怪。也为我工作。删除旧的,复制的旧代码到新文件中,甚至不必清理/构建。
— timman

4

如果您无意中将参数名称大写,并将其命名为与对象相同,也会发生这种情况。

class func didRecieveData(BlockItems: [BlockItems])

3

这可能会帮助某人。

我已经使用称为“ CoreData”的核心数据创建了新的测试项目。不久,我为NSManagedObjectContext和其他Core Data类获得了“使用未声明的类型”。在进行几次导入尝试,添加到Build阶段等之后。我删除了项目,并启动了一个名为“ TestingCoreData”的新项目,并且一切正常。

不要为类命名(测试)项目


3

如果您的签名中有一个与对象类型同名的函数,则也会发生这种情况。例如:

class func Player(playerObj: Player)

由于编译器在查看其他文件之前会先在文件中本地查找,这将导致编译器感到困惑(理应如此)。因此,它查看签名中的“ Player”并认为,这不是该范围内的对象,而是一个函数,所以出了点问题。

也许这是为什么我不应该大写类函数的一个很好的理由。:)


3

在将代码重构到框架中时,我在Xcode 8中收到此错误消息,结果是我忘了在框架中声明该类为 public


2

也许您添加了带有“ FirstNameClass”的类,然后手动重命名为“ ColoredDotView”。尝试将“ ColoredDotView”类的内容复制到剪贴板,从项目中删除“ ColoredDotView”并添加agin。

此ID解决了我的类似问题。



2

就我而言,这是由于在下一行中将子类名称用作具有不同类型的变量名称引起的:

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

请注意,在第一行中,pipGlow是(SKShapeNode的)子类的名称,但是在第二行中,我使用pipGlow作为变量名。这不仅是糟糕的编码风格,而且显然也绝对是不!一旦我将第二行更改为:

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

我不再收到错误。我希望这可以帮助别人!


2

在测试属于应用程序的Swift代码时,首先要确保测试目标正在将应用程序构建为依赖项。然后,在测试中,将应用程序作为模块导入。例如:

@testable import MyApplication

这将使应用程序中的Swift对象可供测试使用。


2

在我的情况下,这是由快速文件的文本编码引起的。一个文件显示为“ No Explicit Encoding”,将其转换为“ UTF-8”后,问题解决了。

而且文件的文本编码不明确的原因是我从其他swift文件复制了所有代码。

没有明确的编码截图

在此处输入图片说明

UTF-8屏幕截图

在此处输入图片说明



1

就我而言,我想添加一个带有自定义swift对象作为类型参数的方法,并且我给该参数中的变量指定的名称与自定义对象类名称完全相同

问题是这样的:

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

粗体字部分导致未声明类型的错误



1

与其他代码一样,正是一些无关的代码导致了@testable故障。

在我的测试目标中,有一个Objective-C标头文件

@import ModuleUnderTest;

我删除了这一行(因为导入实际上是不必要的),并奇迹般地@testable再次开始工作。

我只能对此进行跟踪,但是从我的项目中删除了所有内容,并将其一点一点添加回去,直到失败为止。最终,我找到了问题代码行。



1

万一有人犯了我犯的同样愚蠢的错误...

我收到此错误消息是因为在重命名源文件时,我不小心.从文件名中删除了该文件,因此编译器将该文件视为纯文本文件,而不是作为编译源。

所以我打算将文件重命名为, MyProtocol.swift 但不小心将其命名为 MyProtocolswift

这是一个简单的错误,但事实并非如此。


1

如果未添加正确的导入代理,也可能会明显错过。对我来说,我只是略过导入PriorityUIKit。


1

我的情况是将一个新文件XXView.swift拖到项目中。并将一个View类型声明为XXView,然后出现错误“使用未声明的类型...。”。

我只是尝试将XXView.swift添加到解决错误的测试目标中。但是我不想让我的UI类参与测试目标。

最后,我发现我的ViewController已经在测试目标中,这是不应该发生的。(我想是因为我是通过xctemplate创建VC的,所以它会自动包含在测试目标中)

我从测试目标中删除了视图控制器,然后我的XXView现在无需添加到测试目标中。

结论:确保所有相关文件也应取消选中测试目标。


1

花了一个小时解决此错误后,我发现模块文件已重复。删除多余的文件,然后按shift + cmd + k进行清理,错误消失了。


这可能是一个愚蠢的问题,但您能对此做更多解释吗?重复的swift文件或重复的组等也会发生这种情况吗?它奏效了,但我更想知道为什么会奏效,而不仅仅是接受它会奏效。谢谢您的解决方案!
— Cody Vollrath,

1

在我的情况下,问题在于新的class未被识别。我通过删除该类并重新添加来解决了该问题,但这一次Watch App Extension在创建新类时检查了该选项。

在此处输入图片说明

请注意,我的应用程序中确实有Watch App Extension。


谢谢,就我而言,只需将文件添加到正确的Target。
— coletrain
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.