在我的项目中,我对Objective C枚举进行了Swift扩展,它在Xcode 7.2中表现出色。
但对于Xcode 7.3,它失败了,在我扩展Obj C枚举的Swift文件中出现了"未声明类型"。
我已经构建了一个示例项目,它编译并运行良好,但我无法使现有项目接受对Obj C枚举的扩展。
更新:
在重新安装Xcode 7.2之后,我可以确认该项目编译和构建成功。
在Xcode 7.2中工作后,我尝试在Xcode 7.3中再次启动该项目,但同样的问题是无法构建Obj C enums上的Swift扩展。
在清理并删除了Xcode 7.3中的派生数据后,我还收到了-Swift.h标头丢失错误,因为Swift类还没有编译,所以还没有创建标头。
代码说明:
"FriendRequestResult.h"中的My Obj C枚举:
typedef NS_ENUM(NSInteger, FriendStatus)
{
FriendStatusRequestedByUser = 1,
FriendStatusRequestedByOtherUser,
FriendStatusFriends,
FriendStatusBlocked,
FriendStatusNone,
FriendStatusError,
};
现在,正如在我的AppName Bridging Header.h中所预期的那样,我有:
#import "FriendRequestResult.h"
然后,我对FriendStatus进行了快速扩展,它在Xcode 7.2中构建,但在Xcode 7.3:中因"使用未声明的类型"而失败
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
}
}
}
事实上,这个对enum的扩展还有一些其他的辅助函数,但这不应该以任何方式改变问题。
当然,如果枚举的扩展提供了未声明的类型,那么在Swift代码中的所有地方使用这种类型都会失败,并带有相同的"未声明的东西"。基本上,对于项目的Swift部分,枚举根本不可见,即使导入是在桥接标头中进行的。
这个问题从第一个版本开始进行了大量编辑
解决方案1:已在一个水上数组头文件中移动了枚举。
我的枚举声明与类头在同一个头中,特别是它位于该类的@interface和@end之间。
在Xcode 7.2中,它没有产生任何问题,并且头的解析是成功的,而在Xcode 7.3中,他们可能优化了一些东西,并改变了它的解析方式,所以它看到了我的类,但没有看到里面的枚举[如果它在类声明中,它可能会声明它为私有]
解决方案2:将枚举声明移到了@interface@end范围之外。
要回答您的问题:"我可以以某种方式强制Xcode首先生成Swift头吗?或者我可以强制Xcode相信我的枚举存在于某个地方,它应该验证我的扩展吗?"
我找到了两种订购文件编译的方法。
- 使用目标并使其成为项目的依赖项
- 打开project.pbxproj文件并手动编辑列表
根据你准备应对的风险和复杂性,选择其中一个。
我刚刚尝试扩展ENUM,这里一切都很好。我过去遇到的一个问题是理解Obj-C和Swift之间的名称剥离约定,但这看起来不像你遇到的问题。我遇到的另一个问题是始终维护@#$%Bridging Header.h文件。你肯定这是最新的吗?