升级到 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 时使用未声明的类型的主要内容,如果未能解决你的问题,请参考以下文章
在 Swift 中声明任何类型的数组时使用未声明的类型“T”