Xcode 7.3 Swift代码中Obj C枚举的未声明类型



在我的项目中,我对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相信我的枚举存在于某个地方,它应该验证我的扩展吗?"

我找到了两种订购文件编译的方法。

  1. 使用目标并使其成为项目的依赖项
  2. 打开project.pbxproj文件并手动编辑列表

根据你准备应对的风险和复杂性,选择其中一个。

我刚刚尝试扩展ENUM,这里一切都很好。我过去遇到的一个问题是理解Obj-C和Swift之间的名称剥离约定,但这看起来不像你遇到的问题。我遇到的另一个问题是始终维护@#$%Bridging Header.h文件。你肯定这是最新的吗?

最新更新