Xcode 7.3 Swift 代码中 Obj C 枚举的未声明类型
Xcode 7.3 undeclared type for Obj C enum in Swift code
在我的项目中,我对 Objective C 枚举进行了 Swift 扩展,它在 Xcode 7.2 中表现出色。
但是在 Xcode 7.3 中它失败了 Swift 文件中的 "undeclared type" 我在其中扩展了 Obj C 枚举。
我已经构建了一个示例项目,它编译并运行良好,但我无法让现有项目接受 Obj C 枚举的扩展。
更新:
重装后Xcode7.2可以确认工程编译构建成功
在 Xcode 7.2 中运行后,我尝试在 Xcode 7.3 中再次启动该项目,并再次出现同样的问题 -> Obj C 枚举的 Swift 扩展无法正在建设中。
清理并删除 Xcode 7.3 中的派生数据后,我还收到 -Swift.h header 缺失错误,因为 Swift 类 没有尚未编译,因此尚未创建 header。
代码解释:
我的 Obj C 枚举里面 "FriendRequestResult.h":
typedef NS_ENUM(NSInteger, FriendStatus)
{
FriendStatusRequestedByUser = 1,
FriendStatusRequestedByOtherUser,
FriendStatusFriends,
FriendStatusBlocked,
FriendStatusNone,
FriendStatusError,
};
现在,正如我在 AppName-Bridging-Header.h 中预期的那样,我有:
#import "FriendRequestResult.h"
然后,我对 Xcode 7.2 中构建的 FriendStatus 进行了 swift 扩展,但在 Xcode 7.3 中出现 "use of undeclared type" 失败:
extension FriendStatus
{
init(stringValue : String?)
{
if let stringValue = stringValue
{
switch stringValue
{
case "REQUESTED_BY_USER": self = .RequestedByUser
case "REQUESTED_BY_OTHER": self = .RequestedByOtherUser
case "FRIENDS": self = .Friends
case "BLOCKED": self = .Blocked
default: self = .None
}
}
else
{
self = .None
}
}
}
实际上枚举的这个扩展还有一些其他的辅助函数,但这不应该以任何方式改变问题。
当然,如果枚举的扩展给出了未声明的类型,那么在 Swift 代码的任何地方使用这种类型都会失败,同样 "undeclared things"。基本上,对于项目的 Swift 部分,枚举根本不可见,即使导入是在桥接 header.
中进行的
这个问题在第一版的基础上进行了大量编辑。
回答您的问题:"Can I somehow force Xcode to generate the Swift header first? Or can I force Xcode to believe that my enums exist somewhere and that it should validate my extensions?"
我找到了 2 种命令文件编译的方法。
- 使用目标并使其成为项目的依赖项。
- 正在打开 project.pbxproj 文件并手动编辑列表。
根据您准备应对的风险和复杂程度,选择其中之一。
我刚刚尝试扩展一个 ENUM,一切正常。我过去遇到的一个问题是理解 Obj-C 和 Swift 之间的名称剥离约定,但这看起来不像是您 运行 遇到的问题。
我经常遇到的另一个问题是始终维护@#$% Bridging-Header.h 文件。您确定这是最新的吗?
解决方案一:
将枚举移动到单独的 header 文件中。
我的枚举声明与 class header 在同一个 header 中,特别是在 class 的 @interface 和 @end 之间。
在 Xcode 7.2 中它没有产生任何问题并且 header 的解析成功,而在 Xcode 7.3 中他们可能优化了一些东西并改变了它的解析方式,所以它看到了我的 class,但没有看到其中的枚举 [如果它在 class 声明中,它可能将其声明为私有]
解决方案 2:将枚举声明移到 @interface @end 范围之外。
在我的项目中,我对 Objective C 枚举进行了 Swift 扩展,它在 Xcode 7.2 中表现出色。
但是在 Xcode 7.3 中它失败了 Swift 文件中的 "undeclared type" 我在其中扩展了 Obj C 枚举。
我已经构建了一个示例项目,它编译并运行良好,但我无法让现有项目接受 Obj C 枚举的扩展。
更新:
重装后Xcode7.2可以确认工程编译构建成功
在 Xcode 7.2 中运行后,我尝试在 Xcode 7.3 中再次启动该项目,并再次出现同样的问题 -> Obj C 枚举的 Swift 扩展无法正在建设中。
清理并删除 Xcode 7.3 中的派生数据后,我还收到 -Swift.h header 缺失错误,因为 Swift 类 没有尚未编译,因此尚未创建 header。
代码解释:
我的 Obj C 枚举里面 "FriendRequestResult.h":
typedef NS_ENUM(NSInteger, FriendStatus)
{
FriendStatusRequestedByUser = 1,
FriendStatusRequestedByOtherUser,
FriendStatusFriends,
FriendStatusBlocked,
FriendStatusNone,
FriendStatusError,
};
现在,正如我在 AppName-Bridging-Header.h 中预期的那样,我有:
#import "FriendRequestResult.h"
然后,我对 Xcode 7.2 中构建的 FriendStatus 进行了 swift 扩展,但在 Xcode 7.3 中出现 "use of undeclared type" 失败:
extension FriendStatus
{
init(stringValue : String?)
{
if let stringValue = stringValue
{
switch stringValue
{
case "REQUESTED_BY_USER": self = .RequestedByUser
case "REQUESTED_BY_OTHER": self = .RequestedByOtherUser
case "FRIENDS": self = .Friends
case "BLOCKED": self = .Blocked
default: self = .None
}
}
else
{
self = .None
}
}
}
实际上枚举的这个扩展还有一些其他的辅助函数,但这不应该以任何方式改变问题。
当然,如果枚举的扩展给出了未声明的类型,那么在 Swift 代码的任何地方使用这种类型都会失败,同样 "undeclared things"。基本上,对于项目的 Swift 部分,枚举根本不可见,即使导入是在桥接 header.
中进行的这个问题在第一版的基础上进行了大量编辑。
回答您的问题:"Can I somehow force Xcode to generate the Swift header first? Or can I force Xcode to believe that my enums exist somewhere and that it should validate my extensions?"
我找到了 2 种命令文件编译的方法。
- 使用目标并使其成为项目的依赖项。
- 正在打开 project.pbxproj 文件并手动编辑列表。
根据您准备应对的风险和复杂程度,选择其中之一。
我刚刚尝试扩展一个 ENUM,一切正常。我过去遇到的一个问题是理解 Obj-C 和 Swift 之间的名称剥离约定,但这看起来不像是您 运行 遇到的问题。 我经常遇到的另一个问题是始终维护@#$% Bridging-Header.h 文件。您确定这是最新的吗?
解决方案一: 将枚举移动到单独的 header 文件中。
我的枚举声明与 class header 在同一个 header 中,特别是在 class 的 @interface 和 @end 之间。
在 Xcode 7.2 中它没有产生任何问题并且 header 的解析成功,而在 Xcode 7.3 中他们可能优化了一些东西并改变了它的解析方式,所以它看到了我的 class,但没有看到其中的枚举 [如果它在 class 声明中,它可能将其声明为私有]
解决方案 2:将枚举声明移到 @interface @end 范围之外。