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

我的模块中有一个类型:

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

编译错误是:

Swift: 15:49: 使用未声明类型 ‘ ColoredDotView’

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

enter image description here

我试过清理项目、清理构建文件夹和重新启动 Xcode,但都没有用。在 Swift 中,什么潜在的错误可能导致 undeclared type编译器错误?

229091 次浏览

呼,终于诊断出来了。 无论如何,冒犯的 Swift 文件 EditTaskPopoverController.swift处于两个不同的构建阶段。

它在 Compile Sources中,和所有其他 Swift 文件一起,但是由于一些非常奇怪的原因,它在 Copy Bundle Resources阶段也是 还有,还有我所有的 XIB 和图像资源。

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

如果有人遇到类似的问题,但是 编译源代码修复不能解决这个问题,那么重新启动 Xcode 可能会有问题(这对我来说很有效)。我的 Xcode 版本是 Version 6.1 (6A1052d)

对我来说,当我的测试目标在编译源中没有应用程序构建目标所拥有的一些快速文件时,我遇到了这个错误。这是非常令人困惑的,因为“未声明类型”在很多其他地方使用都没有问题,而且这个错误看起来很模糊。因此,当然存在将包含“未声明类型”的文件添加到测试目标的解决方案。

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

当我最近创建两个新类时,它们的测试目标是主要部分和测试部分。从测试中除去他们的成员身份解决了这个问题。

这个问题已经得到了@Craig Otis 的回答,但是这个问题是由于所讨论的类不属于相同的目标而引起的,通常测试目标丢失了。只要确保勾选了以下复选框。


target membership

剪辑

查看目标成员。选择您的文件,然后打开文件检查器(something + something + 1)[ 选择] + [ 指挥官] + 1

detailed description

也许您已经添加了一些“ FirstNameClass”类,并在此之后手动重命名为“ ColoredDotView”。尝试将“ ColoredDotView”类的内容复制到剪贴板,从项目中删除“ ColoredDotView”,然后再次添加。

这个 ID 从我这里解决了类似的问题。

对我来说,这是我犯的一个错误。我添加了一个新文件“ OS X > Source > Cocoa Class”,而不是“ iOS > Source > Cocoa Touch Class”。

在 XCode 菜单 Product-> Clean and then Product-> Build 中,我使用的是 Product。当在新的 Group/Folder 中将新的 ViewController 添加到我的项目时,我遇到了这个问题。

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

@IBOutlet weak var tableView: CustomTableView!

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

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

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

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

在我的案例中,对于实际原因,这是一个非常具有误导性的错误消息。

这也许能帮到某人。

我用 CoreData 创建了一个新的测试项目,名为“ CoreData”。简而言之,我得到了 NSManagedObjectContext 和其他核心数据类的“使用未声明类型”。经过几次导入、添加到 Build 阶段等尝试之后。我已经删除了一个叫做“ TestingCoreData”的项目,并开始了一个新的项目。

不要命名(测试)项目,比如类的名称

在我的例子中,我希望添加一个方法,它的类型参数是一个自定义快速对象,我给参数中变量的名称与自定义对象类的名称完全相同

问题是这样的:

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

大胆字符中的部分导致未声明类型的错误

我尝试了这里提供的许多解决方案,但最终删除了该文件并重新创建了它,Xcode 被平息了:/

类型 Int出错,原因是在枚举中引用了称为 .Int的本地 case

(){ 开关本身{ 情况(var 信息) : //... . . 一些其他的代码 } }

这里有个错误 SomFuncWithInt (参数: Int)

修好了 SomFuncWithInt (参数: Swift. Int)

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

class func Player(playerObj: Player)

因为编译器在查看其他文件之前首先查看文件的本地内部,所以会使编译器感到困惑(这是正确的)。它看着签名中的“ Player”然后想,这不是这个范围内的一个对象,而是一个函数,所以有些地方不对劲。

也许这就是为什么我不应该大写类函数的原因。 :)

在我的例子中,这是由于在下一行中使用了一个子类名作为具有不同类型的变量名:

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

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

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

我不再收到错误。我希望这对某人有帮助!

正如其他人在 这根线中提到的那样

在“复制包资源”中使用不需要的快速文件 screen shot for helping

如果意外地将参数名称大写,并将其调用为与对象相同的名称,也会发生这种情况。

class func didRecieveData(BlockItems: [BlockItems])

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

@testable import MyApplication

这将使作为应用程序一部分的 Swift 对象对测试可用。

当我在 Xcode 8中将代码重构到框架中时,我得到了这个错误消息,结果我忘记将框架中的类声明为 public

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

由于某种原因,添加到 Xcode 框架中的文件不是编译源的一部分。如果您的 Swift 文件不是编译源代码的一部分,您需要通过点击 + 并在弹出窗口中选择它们来添加它们。

Screenshot 1

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

Screenshot 2

和其他人一样,是一些不相关的代码导致了 @testable的故障。

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

@import ModuleUnderTest;

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

我只能跟踪到这一点,但删除了我的项目中的一切,并添加回来,一点一点,直到它失败。最终我发现了代码的问题行。

在我的案例中,这是由快速文件的文本编码造成的。 一个文件显示“无显式编码”,并转换为“ UTF-8”后,问题解决了。

文件的文本编码不明确的原因是我复制了其他快速文件的所有代码。

没有显式编码屏幕截图

enter image description here

UTF-8截图

enter image description here

如果你是从不同的 moduleTarget访问它,那么你只需要它的 public

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

之所以出现这个错误,是因为在重命名源文件时,我不小心从文件名中删除了 .,因此编译器将该文件视为纯文本文件,而不是要编译的源文件。

所以我想把文件重命名为 MyProtocol.swift 却不小心给它起了个名字 MyProtocolswift

这是一个简单的错误,但并不是很明显,这就是正在发生的事情。

清理项目解决了我的问题。

步骤: Product-> Clean (or Shift + Cmd + K)

没有添加正确的导入分隔符也可能是一个明显的遗漏。对我来说,我只是忽略了导入 PriorityUIKit。

在我的例子中,TestTarget 的 编译源拥有来自主目标的文件

参考资料 :

Test Target contains files from main target in compile sources tab

为什么会这样?

  • 这是因为我们在创建 文件

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

    参考资料 :

    Create File - Test Target is Checked

我是怎么解决的?

  • 我从 Test Target 的编译源中删除了主目标的文件

有时候,错误是非常愚蠢的

在检查这里的所有解决方案之前,确保你有 所有基本的东西都是进口的

     import Foundation
import UIKit

当您从外部导入一些文件时,很有可能 你的项目,这可能会错过这些基本的东西,因为我的经验 一次。

我的情况是将一个新文件 XXView.swift 拖入项目中。并声明一个 View 类型为 XXView,然后出现错误“ use of unDeclaration type... .”。

我只是尝试将我的 XXView.swift 添加到测试目标中,它解决了这个错误。 但是我不希望我的 UI 类参与到测试目标中。

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

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

结论: 确保您的所有相关文件也应该取消检查测试目标。

在花了一个小时处理这个错误之后,我发现模块文件被复制了。删除额外的文件,shift + cmd + k 来清除,错误就消失了。

这个问题似乎有多种原因。遵循既定答案并不能解决问题。对我来说是 产品 > 清洁生成文件夹

在我的案例中,问题是一个新的 class没有被识别。我通过删除类并重新添加它来解决这个问题,但是这次在创建新类时检查 Watch App Extension选项。

enter image description here

请注意,我的应用程序中确实有一个监视应用程序扩展。

对我来说,问题是我使用的类型是在 Objective-c 中的一个快速项目,我忘记在桥接头文件中导入类型的 Objective-c 头文件