如何使用带有@objc标签的Swift枚举?

37

我需要定义一个协议,可以在使用一些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标记的枚举?


看看我的回答。我很确定你的问题出在其他地方。 - Sulthan
2个回答

63

2
提示:这似乎仅适用于 Int 类型的枚举。将 @objc 应用于 String 类型的枚举会产生以下编译错误:“'@objc' 枚举原始类型 'String' 不是整数类型。” - Vince O'Sullivan
1
objc(以及许多其他语言)仅支持将枚举用于整数。Swift在这方面是独一无二的。 - Oren
2
在Swift 2.0中无法工作。ObjC中看不到Swift ENUM。 - GoodSp33d
请确保您的枚举类型为Int并像上面的示例一样标记为@objc。 - Oren
它必须是Int类型,因为由于obj-c / c枚举类型的表示方式与Swift不同。 - piotr_ch

10

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

我的代码是纯Swift的,但它崩溃了,与我在这里提出的另一个问题有关:http://stackoverflow.com/questions/24137090/custom-uitableviewcell-delegate-pattern-in-swift - Dimillian
你应该保留你的编辑,你的问题回答完美地匹配了我的代码,但正如你所说,我的代码是纯Swift的。我以为崩溃是因为我没有在前面加上@objc标签。但听起来我错了。 - Dimillian
@Dimillian77 抱歉,我进行了无效的编辑,不得不重新写一遍。 - Sulthan
除非您的协议需要可选值...否则会非常烦人...哦,好吧。 - Morkrom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接