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 种命令文件编译的方法。

  1. 使用目标并使其成为项目的依赖项。
  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 范围之外。