Swift代码

时间:2016-03-24 14:37:40

标签: swift xcode7.3

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

此问题已从其第一个版本进行了大量编辑。

2 个答案:

答案 0 :(得分:9)

解决方案1: 将枚举移到了一个seaparate头文件中。

我的枚举声明与类标题位于同一标题中,特别是它位于该类的@interface和@end之间。

在Xcode 7.2中,它没有创建任何问题,并且标头的解析是成功的,而在Xcode 7.3中,它们可能优化了某些内容并改变了它的解析方式,所以它看到的是我的课程,但不是枚举在它内部[也许它如果它在类声明中声明它是私人的]

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

答案 1 :(得分:1)

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

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

  1. 使用目标并使其成为项目的依赖项。
  2. 打开project.pbxproj文件并手动编辑列表。
  3. 根据您准备解决的风险和复杂程度,选择其中一个。

    我只是尝试扩展ENUM,这里的工作正常。我过去遇到的一个问题是理解Obj-C和Swift之间的名称剥离惯例,但这看起来不像你遇到的问题。 我遇到的另一个问题是始终保持@#$%Bridging-Header.h文件。你肯定这是最新的吗?