"使用未申报的类型"在Swift中,即使type是internal,也存在于同一个模块中

时间:2014-08-22 00:22:41

标签: xcode 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...
    ...
}

编译错误是:

  

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

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

enter image description here

我尝试清理项目,清理构建文件夹,然后重新启动Xcode,但无济于事。什么潜在的错误可能导致Swift中的undeclared type编译器错误?

32 个答案:

答案 0 :(得分:176)

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

答案 1 :(得分:157)

@Craig Otis已经回答了这个问题,但问题是当有问题的类不属于同一个目标时,通常缺少测试目标。只需确保勾选以下复选框。

target membership

修改

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

detailed description

答案 2 :(得分:32)

P,最后确诊了这个。 以某种方式,违规的Swift文件EditTaskPopoverController.swift处于两个不同的构建阶段。

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

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

答案 3 :(得分:16)

在XCode菜单中,Product-> Clean,然后Product-> Build为我工作。我在新的组/文件夹中添加新的ViewController到我的项目时遇到了这个问题。

答案 4 :(得分:11)

我遇到了完全相同的问题。我的框架中的某些文件无法从同一模块中的其他类访问。​​

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

Screenshot 1

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

Screenshot 2

答案 5 :(得分:11)

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

@IBOutlet weak var tableView: CustomTableView!

在实现中我有一个以 CustomTableView

开头的函数
func CustomTableView(tableView: CustomTableView, dataForRow row:  Int) -> NSData {...}

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

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

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

答案 6 :(得分:4)

在我的应用程序中,我有app delegate和其他需要由测试公开访问的类。 As outlined here,然后我将我的应用导入我的测试中。

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

答案 7 :(得分:3)

如果有人遇到类似的问题,但Compile Sources fix无法解决问题,重新启动Xcode可能(它适用于我)。我的Xcode版本是Version 6.1 (6A1052d)

答案 8 :(得分:3)

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

class func didRecieveData(BlockItems: [BlockItems])

答案 9 :(得分:2)

我尝试了很多这里提供的解决方案,但最终删除了文件并再次创建了它,并且Xcode被安抚了:/

答案 10 :(得分:2)

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

class func Player(playerObj: Player)

将导致编译器混淆(并且理所当然),因为编译器在查看其他文件之前将首先在文件中本地查找。所以它看着" Player"在签名中并且认为,这不是这个范围内的对象,而是一个函数,所以出了点问题。

也许这就是为什么我不应该把班级功能资本化的一个很好的理由。 :)

答案 11 :(得分:2)

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

答案 12 :(得分:2)

这可能有助于某人。

我用Core Data创建了一个名为“CoreData”的新测试项目。很快我就为NSManagedObjectContext和其他Core Data类提供了“使用未声明的类型”。在多次尝试导入,添加到构建阶段等之后,我删除了项目并启动了一个名为“TestingCoreData”的新项目,并且一切运行良好。

不要命名(测试)项目名称

答案 13 :(得分:2)

  

有时错误可能很愚蠢

     

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

     import Foundation
     import UIKit
  

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

答案 14 :(得分:1)

在我的情况下,这是由于下一行中使用的子类名称作为具有不同类型的变量名称引起的:

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

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

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

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

答案 15 :(得分:1)

在我的情况下,我犯了一个错误。我添加了一个新文件" OS X> Source> Cocoa Class",而不是" iOS> Source> Cocoa Touch Class"。

答案 16 :(得分:1)

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

答案 17 :(得分:1)

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

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

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

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

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

答案 18 :(得分:1)

在我的情况下,TestTarget的编译源具有来自主目标的文件

参考

Test Target contains files from main target in compile sources tab

为什么会这样?

  • 之所以会这样,是因为我们在创建时检查了TestTarget关联 文件

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

    参考

    Create File - Test Target is Checked

我如何解决?

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

答案 19 :(得分:1)

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

步骤: 产品->清理(或Shift + Cmd + K)

答案 20 :(得分:0)

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

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

没有显式编码屏幕截图

enter image description here

UTF-8截图

enter image description here

答案 21 :(得分:0)

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

答案 22 :(得分:0)

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

enter image description here

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

答案 23 :(得分:0)

此问题似乎有多种原因。遵循公认的答案并不能解决问题。对我来说,它是产品>干净的构建文件夹

答案 24 :(得分:0)

未添加正确的导入代理也可能会导致明显的丢失。对我来说,我只是省略了导入PriorityUIKit。

答案 25 :(得分:0)

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

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

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

这是一个简单的错误,但目前尚不清楚这是怎么回事。

答案 26 :(得分:0)

如果您要从其他moduleTarget访问它,则只需要它public即可

答案 27 :(得分:0)

与其他人一样,一些不相关的代码导致@testable出现故障。

在我的测试目标中有一个具有

的Objective-C头文件

@import ModuleUnderTest;

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

我只能跟踪它,但是从我的项目中移除所有内容并将其逐渐添加回来直到失败。最终我找到了问题的代码行。

答案 28 :(得分:0)

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

此ID修复了我的类似问题。

答案 29 :(得分:0)

正如其他人在this thread

中提到的那样

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

答案 30 :(得分:0)

在我的情况下,我想添加一个带有自定义swift对象的方法作为类型参数,我在参数中给变量的名称与自定义对象类名称完全相同

问题是这样的:

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

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

答案 31 :(得分:-1)

由于引用了名为Int

的枚举中的本地case,因此类型.Int出现错误

func foo() { switch self { case .Int(var info): // ..... some other code } }

这里有错误 someFuncWithInt(parameter: Int)

修正了它 someFuncWithInt(parameter: Swift.Int)