我需要定义一个可以在使用某些Objective-c类型的类中调用的协议
但是这样做不起作用:
enum NewsCellActionType: Int { case Vote = 0 case Comments case Time } @objc protocol NewsCellDelegate { func newsCellDidSelectButton(cell: NewsCell, actionType: NewsCellActionType) }
你明白他的错误
Swift enums cannot be represented in Objective-C
如果我没有在协议上放置@objc标记,则它将在采用该协议并从Objective- C类型类(如UIViewController)继承的类中被调用时立即使应用程序崩溃。
所以我的问题是,我应该如何使用@objc标签声明并传递我的枚举?
Swift枚举与Obj-C(或C)枚举有很大不同,它们不能直接传递给Obj-C。
解决方法是,可以使用Int参数声明方法。
Int
func newsCellDidSelectButton(cell: NewsCell, actionType: Int)
并作为传递NewsCellActionType.Vote.toRaw()。但是,您将无法从Obj-C访问枚举名称,这使代码更加困难。
NewsCellActionType.Vote.toRaw()
更好的解决方案可能是在Obj-C中实现枚举(例如,在桥接头中),因为这样它将可以在Swift中自动访问,并且可以将其作为参数传递。
编辑
不需要添加@objc仅用于Obj-C类。如果您的代码是纯Swift,则可以毫无问题地使用枚举,请参见以下示例作为证明:
@objc
enum NewsCellActionType : Int { case Vote = 0 case Comments case Time } protocol NewsCellDelegate { func newsCellDidSelectButton(cell: UITableViewCell?, actionType: NewsCellActionType ) } @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate, NewsCellDelegate { var window: UIWindow? func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool { self.window = UIWindow(frame: UIScreen.mainScreen().bounds) self.window!.backgroundColor = UIColor.whiteColor() self.window!.makeKeyAndVisible() test() return true; } func newsCellDidSelectButton(cell: UITableViewCell?, actionType: NewsCellActionType) { println(actionType.toRaw()); } func test() { self.newsCellDidSelectButton(nil, actionType: NewsCellActionType.Vote) } }