如何使用@objc标签传递快速枚举

发布于 2021-01-31 23:40:09

我需要定义一个可以在使用某些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标签声明并传递我的枚举?

关注者
0
被浏览
48
1 个回答
  • 面试哥
    面试哥 2021-01-31
    为面试而生,有面试问题,就找面试哥。

    Swift枚举与Obj-C(或C)枚举有很大不同,它们不能直接传递给Obj-C。

    解决方法是,可以使用Int参数声明方法。

    func newsCellDidSelectButton(cell: NewsCell, actionType: Int)
    

    并作为传递NewsCellActionType.Vote.toRaw()。但是,您将无法从Obj-C访问枚举名称,这使代码更加困难。

    更好的解决方案可能是在Obj-C中实现枚举(例如,在桥接头中),因为这样它将可以在Swift中自动访问,并且可以将其作为参数传递。

    编辑

    不需要添加@objc仅用于Obj-C类。如果您的代码是纯Swift,则可以毫无问题地使用枚举,请参见以下示例作为证明:

    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)
        }
    }
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看