如何在iOS 8 Swift框架的公共API中使用枚举

3

我正在尝试创建一个Swift框架,可供其他使用Swift或Objective C的iOS 8应用程序使用。

在我的一些公共函数中,我需要使用枚举。当然,Swift有枚举,但这些枚举不兼容使用Objective C的客户端应用程序。因此,我尝试使用Objective C风格的枚举形式:

typedef NS_ENUM(NSInteger, MyEnumType)
{
    MyEnumTypeGreen,
    MyEnumTypeBlue,
    MyEnumTypeYellow
};

为了使这个枚举类型公开,我把它的声明放在PublicEnums.h文件中。为了从我的Swift代码中访问,我需要在我的框架项目的Bridging-Header.h文件中添加以下行:
#import "PublicEnums.h"

但是我遇到了这个错误:

在框架模块“ MyFramework”中包含非模块化标头,这会标记自动生成的MyFramework-Swift.h文件中的一行:


#import "/Users/sourcepath.../ObjectiveC/MyFramework-Bridging-Header.h"

在 Swift 框架中,是否真的没有任何一种枚举可以从 Objective-C 应用程序中使用?

1个回答

1
我刚在一个新项目中测试了这个,一切正常。我认为你的错误是因为没有正确使用桥接头文件。
我认为你不应该使用导入语句导入桥接头文件。它应该自动添加到你的目标的构建设置中的桥接头键下:
Objective-C Bridging Header ------     projectName/projectName-Bridging-Header.h

这个键的原始名称是SWIFT_OBJC_BRIDGING_HEADER
测试:
    let x = MyEnumType.Blue
    println("\(x.toRaw())") // 1

请注意,在 Xcode 6.1 中,最后一行将使用 rawValue

谢谢。但是我没有#import桥接头文件;它实际上是在项目级别上设置的,就像你描述的那样。错误发生是因为自动生成的MyFramework-Swift.h自动包含了那个#import语句。我认为要重现这个问题,您需要一个单一的工作区,其中包括一个Swift框架和一个引用该框架的示例应用程序。 - Daniel
如果您的框架不兼容,请向维护者请求更新。 - Mundi
嗯,我猜你得自己更新它,对吧?移除 include 语句! - Mundi
就像我说的那样,MyFramework-Swift.h文件是自动生成的。这个过程发生在构建时的消费应用程序中,我无法删除这行代码。 - Daniel
似乎在将Swift导入Objective-C或反之间存在差异。在这种情况下,您想将Objective-C导入Swift,并且上述内容描述了如何完成此操作。 "MyFramework-Swift.h"文件用于将Swift导入Objective-C。我认为可以轻松避免同时混合两者。 - Mundi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接