有没有可能在Obj-C中使用Swift的Enum?

我试图将我的一些Obj-C类转换成Swift。 还有一些其他的Obj-C类仍然在那个转换的类中使用枚举。 我在预发布文档中search,无法find它,或者我错过了它。 有没有办法在Obj-C类中使用Swift枚举? 或者链接到这个问题的文档?

这就是我如何在旧的Obj-C代码和新的Swift代码中声明我的枚举。

我的老对象C代码:

typedef NS_ENUM(NSInteger, SomeEnum) { SomeEnumA, SomeEnumB, SomeEnumC }; @interface SomeClass : NSObject ... @end 

我新的斯威夫特代码:

 enum SomeEnum: NSInteger { case A case B case C }; class SomeClass: NSObject { ... } 

更新:从答案。 它不能在Swift早于1.2的版本中完成。 但根据这个官方Swift博客 。 在与XCode 6.3一起发布的Swift 1.2中,您可以在Objective-C中使用Swift Enum, @objcenum前面添加@objc

从Swift版本1.2(Xcode 6.3)你可以。 只需在@objc加上枚举声明@objc

 @objc enum Bear: Int { case Black, Grizzly, Polar } 

从Swift博客无耻地采取


在Objective-C中,这看起来像

 Bear type = BearBlack; switch (type) { case BearBlack: case BearGrizzly: case BearPolar: [self runLikeHell]; } 

从使用Swift与Cocoa和Objective-C指南:

Swift类或协议必须使用@objc属性标记为可在Objective-C中访问和使用。 […]

只要与Objective-C兼容,您就可以访问使用@objc属性标记的类或协议中的任何内容。 这不包括Swift-only特性,例如:

在swift /结构中定义的generics元组/定义在Swift / Swift样式variables/嵌套types/咖喱函数中定义的Swift / Typealiases中定义的Swift / Top层次函数中定义的generics/ 枚举

所以,不,你不能在Objective-C类中使用Swift枚举。

要展开所选的答案…

使用NS_ENUM()在Swift和Objective-C之间共享Swift样式的枚举。

它们只需要使用NS_ENUM()在Objective-C上下文中定义,并且可以使用Swift点符号。

从使用cocoa和Objective-C的Swift

Swift导入作为Swift枚举任何C样式枚举标记与NS_ENUMmacros。 这意味着枚举值名称的前缀在被导入到Swift时被截断,无论它们是在系统框架还是在自定义代码中定义的。

Objective-C的

 typedef NS_ENUM(NSInteger, UITableViewCellStyle) { UITableViewCellStyleDefault, UITableViewCellStyleValue1, UITableViewCellStyleValue2, UITableViewCellStyleSubtitle }; 

迅速

 let cellStyle: UITableViewCellStyle = .Default 

如果你想保持ObjC代码不变,你可以在你的项目中添加一个helper头文件:

 Swift2Objc_Helper.h 

在头文件中添加这个枚举types:

 typedef NS_ENUM(NSInteger, SomeEnum4ObjC) { SomeEnumA, SomeEnumB }; 

在.m文件中可能会有另一个地方进行更改:包含隐藏的头文件:

 #import "[YourProjectName]-Swift.h" 

用你的项目名称replace[YourProjectName]。 这个头文件暴露了所有Swift定义的@objc类,枚举到ObjC。

您可能会收到关于从枚举types的隐式转换的警告消息…这是可以的。

顺便说一句,你可以使用这个头助手文件来保存一些ObjC代码,如#define常量。

如果你(像我)真的想要使用string枚举,你可以为objective-c做一个专门的接口。 例如:

 enum Icon: String { case HelpIcon case StarIcon ... } // Make use of string enum when available: public func addIcon(icon: Icon) { ... } // Fall back on strings when string enum not available (objective-c): public func addIcon(iconName:String) { addIcon(Icon(rawValue: iconName)) } 

当然,这不会给你自动完成的便利(除非你在objective-c环境中定义了额外的常量)。