【问题标题】:Xcode 7.3 undeclared type for Obj C enum in Swift codeSwift 代码中 Obj C 枚举的 Xcode 7.3 未声明类型
【发布时间】:2016-03-24 14:37:40
【问题描述】:

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

这个问题在第一版的基础上进行了大量编辑。

【问题讨论】:

  • 您介意分享一些代码示例吗?
  • @JohnDifool,我会尝试.. 但在这种情况下,确保您共享正确的部分似乎很复杂。
  • 我创建了一个新的混合项目,你的 typedef NS_ENUM(NSInteger, FriendStatus) 在一个 Objective-C 头文件中,你的 extension FriendStatus 在一个 Swift 文件中。它编译得很好。你能告诉我如何得到错误吗?
  • 不幸的是,我不知道究竟是什么导致了这个问题。如问题中所述,我还设法做了一个有效的新样本。如果我知道究竟是什么在 Swift 代码中为 Obj C 枚举创建了“未定义”,我也许能够解决它。如果在Objective C中只有一个像@class这样的指令,您可以通过它向编译器保证存在特定类型......因为我想它还没有设法到达代码的Obj C部分尝试编译 swift 扩展 [即使在示例中它可以工作.. 我知道]
  • 好吧,我想说的是创建一个新项目,将所有内容迁移到其中,一切就绪。没有?

标签: swift xcode7.3


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

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

    【讨论】:

    • 不幸的是,我想我必须重新提出这个问题。根据我的进一步研究,似乎 Obj C 枚举的扩展不适用于 Swift 2.2 和 Xcode 7.3,但我目前正在调查。现在这似乎与没有生成标头这一事实无关,而是 Obj C 枚举现在在 Swift 标头中的表示方式可能与以前不同 [使用 Swift 2.2 和 Xcode 7.3]
    • 回到基础并尝试从头开始构建一个简单的示例。这就是我刚刚所做的,并确认,事情正在按他们应该的方式工作。祝你好运!
    • 是的,我刚刚完成了我自己的样品,它的工作原理与您确认的一样。
    • 发生这些事情 :-) 关心分享?我可能会在以后使用该见解。
    • 不用担心。当有人弄清楚事情时,阅读总是很高兴。我希望那个人更经常是我 :-) 顺便说一句,我的测试用例确实将 ENUM 声明分隔在它自己的头文件中(因为该项目足够琐碎以允许它。)
    猜你喜欢
    • 1970-01-01
    • 2016-07-11
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 2015-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多