5

在我的项目中,我对 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 枚举上的 Swift 扩展。

在 Xcode 7.3 中清理和删除派生数据后,我还收到 -Swift.h 标头丢失错误,因为尚未编译 Swift 类,因此尚未创建标头。

代码说明:

“FriendRequestResult.h”中的我的 Obj C 枚举:

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 部分,枚举根本不可见,即使导入是在桥接头中进行的。

这个问题是从它的第一个版本中大量编辑的。

4

2 回答 2

9

解决方案 1:将枚举移动到单独的头文件中。

我的枚举声明与类头在同一个头中,特别是在该类的@interface 和@end 之间。

在 Xcode 7.2 中它没有产生任何问题并且标头的解析是成功的,而在 Xcode 7.3 中他们可能优化了一些东西并改变了它的解析方式,所以它看到了我的类,而不是它里面的枚举 [也许它声明了它如果它在类声明中,则为私有]

解决方案 2:将枚举声明移到 @interface @end 范围之外。

于 2016-03-24T18:46:05.873 回答
1

回答您的问题:“我可以以某种方式强制 Xcode 首先生成 Swift 标头吗?或者我可以强制 Xcode 相信我的枚举存在于某个地方并且它应该验证我的扩展?”

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

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

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

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

于 2016-03-24T17:14:54.400 回答