在我的项目中,我在Objective C enums上有Swift扩展,它在Xcode 7.2中运行得非常出色。
但是在Xcode 7.3中,它在Swift文件中以“未声明的类型”失败,我扩展了Obj C枚举。
我已经构建了一个示例项目,它编译并运行良好,但我不能让现有项目接受Obj C枚举的扩展。
更新:
重新安装Xcode 7.2后,我可以确认项目是否已成功编译和构建。
在Xcode 7.2中工作之后,我尝试在Xcode 7.3中再次启动这个项目,并再次出现同样的问题 - >无法构建对Obj C枚举的Swift扩展。
在Xcode 7.3中清理并删除派生数据之后,我还收到了-Swift.h头文件丢失错误,因为尚未编译Swift类,因此尚未创建头文件。
代码说明:
My Obj C enum在“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进行了快速扩展,但在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
}
}
}
实际上,这个对枚举的扩展还有一些其他辅助函数,但这不应该以任何方式改变问题。
当然,如果枚举的扩展名给出了未声明的类型,那么在Swift代码中使用相同的“未声明的东西”时,使用此类型将失败。基本上,对于项目的Swift部分,枚举根本不可见,即使导入是在桥接头中进行的。
此问题已从其第一个版本进行了大量编辑。
答案 0 :(得分:9)
解决方案1: 将枚举移到了一个seaparate头文件中。
我的枚举声明与类标题位于同一标题中,特别是它位于该类的@interface和@end之间。
在Xcode 7.2中,它没有创建任何问题,并且标头的解析是成功的,而在Xcode 7.3中,它们可能优化了某些内容并改变了它的解析方式,所以它看到的是我的课程,但不是枚举在它内部[也许它如果它在类声明中声明它是私人的]
解决方案2:将enum声明移到@interface @end范围之外。
答案 1 :(得分:1)
回答你的问题:“我可以以某种方式强制Xcode首先生成Swift标头吗?或者我可以强制Xcode相信我的枚举存在于某个地方并且它应该验证我的扩展吗?”
我找到了两种订购文件编译的方法。
根据您准备解决的风险和复杂程度,选择其中一个。
我只是尝试扩展ENUM,这里的工作正常。我过去遇到的一个问题是理解Obj-C和Swift之间的名称剥离惯例,但这看起来不像你遇到的问题。 我遇到的另一个问题是始终保持@#$%Bridging-Header.h文件。你肯定这是最新的吗?