有没有可能在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, @objc
在enum
前面添加@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_ENUM
macros。 这意味着枚举值名称的前缀在被导入到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环境中定义了额外的常量)。