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

Cra*_*tis 159 xcode swift

我的模块中有一个类型:

import Cocoa

class ColoredDotView : NSView {
   ...
}
Run Code Online (Sandbox Code Playgroud)

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

class EditSubjectPopoverController : NSObject {

    @IBOutlet internal var subjectColorDotView : ColoredDotView!
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

class EditTaskPopoverController : NSObject {

    @IBOutlet internal var lowPriorityDotView : ColoredDotView! // Error here
    @IBOutlet internal var medPriorityDotView : ColoredDotView! // And here...
    @IBOutlet internal var highPriorityDotView : ColoredDotView! // And here...
    ...
}
Run Code Online (Sandbox Code Playgroud)

编译错误是:

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

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

在此输入图像描述

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

mat*_*orb 187

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

  • 对我来说也是一样:当测试目标中包含的另一个类使用的类也不包含在测试目标中时,就会出现问题!(╯°□°)╯︵ ┻━┻ (3认同)
  • 你刚刚解决了一个困扰我半小时的问题。我已经将一些以前的 Swift 类导入到当前项目中,但显然还没有将旧的类添加到测试目标中。但是自动完成让我觉得一切都很好……直到我尝试构建和运行。什么……!非常感谢你。 (2认同)
  • 这也为我解决了这个问题。我点击了一个文件,然后文件->复制了它的副本。新副本已列出但未包含在“编译源”中 (2认同)

Edw*_*win 171

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


目标会员

编辑

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

详细说明

  • 确实,取消选中测试目标,因为这就是我们在测试项目中“@testable import ...”的原因。 (2认同)

Cra*_*tis 35

P,最后确诊了这个.不知何故,违规的Swift文件EditTaskPopoverController.swift处于两个不同的构建阶段.

Compile Sources与所有其他Swift文件一样正确,但由于一些非常奇怪的原因,它也在Copy Bundle Resources同一阶段,以及我的所有XIB和图像资源.

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

  • 伴侣!救生员,这让我头疼。干杯 (2认同)

Arr*_*ray 23

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

  • 2个小时,我从来没有想过在安装pod之后点击构建按钮来合并框架...我现在要离开...... (5认同)

Gro*_*oot 13

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

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

截图1

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

截图2


And*_*rew 12

我的原因是一个函数名称,以类型相同的字符开头:

@IBOutlet weak var tableView: CustomTableView!
Run Code Online (Sandbox Code Playgroud)

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

func CustomTableView(tableView: CustomTableView, dataForRow row:  Int) -> NSData {...}
Run Code Online (Sandbox Code Playgroud)

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

func dataForRow(row: Int, tableView: CustomTableView) -> NSData {...}
Run Code Online (Sandbox Code Playgroud)

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


lin*_*fox 8

如果有人遇到类似的问题但Compile Sources 修复没有解决问题,重新启动 Xcode 可能(它对我有用)。我的 Xcode 版本是Version 6.1 (6A1052d).


Nat*_*Uni 5

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

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


小智 5

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

参考

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

为什么会这样?

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

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

    参考

    创建文件-检查目标

我如何解决?

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


Sur*_*mas 5

有时错误可能非常愚蠢

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

     import Foundation
     import UIKit
Run Code Online (Sandbox Code Playgroud)

很有可能当你从外部导入一些文件到你的项目时,这可能会错过我曾经经历过的这些基本东西。