我需要定义一个可以在使用某些Objective-c类型的类中调用的协议(protocol)

但是这样做不起作用:

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

如果我不在协议(protocol)上使用@objc标记,则会在采用该协议(protocol)并从Objective-C类型类(如UIViewController)继承的类中调用该应用程序时立即使该应用程序崩溃。

所以我的问题是,我应该如何使用@objc标记声明并传递我的枚举?

最佳答案

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

关于ios - 如何通过@objc标签传递快速枚举,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24140545/

10-09 15:45
查看更多