升级到 Swift 3 时使用未声明的类型

Posted

技术标签:

【中文标题】升级到 Swift 3 时使用未声明的类型【英文标题】:Use of undeclared type when upgrading to Swift 3 【发布时间】:2017-01-26 13:44:02 【问题描述】:

我正在开发一个使用 Swift 2.3 制作的大型 ios 项目,该项目使用一些私有 CocoaPods (v. 1.1.1)。在其中一个 pod(用 Objective-C 制作)中,它有一个名为 Enums.h 的文件。此文件包含例如此代码:

typedef NS_ENUM(NSInteger, MyEnum)
    MyEnumOne,
    MyEnumTwo
;

在我的应用程序(Swift 2.3)中,我为枚举实现了几个扩展,例如这个。例如这个例子:

extension MyEnum
    func name()->String
        return "some name"
    

这显然只是实际情况的一个小例子,但你明白了。

我现在正试图将我的项目升级到 Swift 3.0,并使用 Xcode 自己的转换。我的代码现在充满了错误,但这是意料之中的。但是,我不知道如何解决此错误:

Xcode 现在用红色错误标记扩展文件的第一行:extension MyEnum,并显示Use of undeclared type 'MyEnum'。如果我 CMD+单击名称 MyEnum,我会被定向到我的 cocoapod 内的枚举,正是它声明的位置。为什么 Xcode 告诉我它未声明?这在 Swift 2.3 中运行良好..

当我更新 Swift 版本并尝试更新 pod 时,cocoapods 抱怨我的 podfile 没有说 use_frameworks!,所以我添加了它。这会导致错误吗?

编辑: 即使在我的扩展文件中的 name() 函数内(现在显示“使用未声明的类型”),我也可以开始输入 self. 并获得自动完成窗口,指出 self 是 @ 的一个实例987654331@,它显示了我可以使用的正确值,例如rawValue。 Xcode 清楚地知道我的 Enum,但它仍然显示 Use of undeclared type 'MyEnum'

【问题讨论】:

您使用的是哪个版本的 CocoaPods? @redent84 1.1.1 您是否正在导入包含 Swift 文件中枚举的模块? @redent84 不,我从来没有……这是我使用use_frameworks!时必须做的事情吗? 是的,CocoaPods 框架在 swift 代码中作为模块导入。 【参考方案1】:

使用 CocoaPods 1.0+,框架被编译为动态框架,必须导入才能使用。

尝试将import 语句添加到您的 Swift 文件中。例如,如果 CocoaPod 被命名为MyModule

在斯威夫特中:

import MyModule

或在 Objective-C 中

@import MyModule;

在扩展文件的顶部。

【讨论】:

你的评论对我也有帮助

以上是关于升级到 Swift 3 时使用未声明的类型的主要内容,如果未能解决你的问题,请参考以下文章

未调用 BLE 外设委托

在 Swift 中声明任何类型的数组时使用未声明的类型“T”

Swift 3 核心数据“实体”错误:`使用未声明的类型`

FBSDKGRAPHRequestConnection 警告 swift 3

当firebase ui升级到3.2.2时输出未显示

Objective-C 库的 Swift “使用未声明的类型”