使用Swift枚举在Swift中覆盖Obj-C方法

时间:2018-09-27 15:28:53

标签: objective-c swift enums

我有以下使用Objective-C枚举的Objective-C类:

MyClass.h

typedef NS_ENUM(NSInteger, MyEnum) {
  MyEnumCase1
};

@interface MyClass : NSObject

-(void)method:(MyEnum)param;

@end

MyClass.m

@implementation MyClass

-(void)method:(MyEnum)param {}

@end

我可以在Swift中创建MyClass的子类,并重写这样的方法:

SubClass.swift

class SubClass: MyClass {    
  override func method(_ param: MyEnum) {}
}

但是,如果我在Swift中而不是在Objective-C中定义枚举,则覆盖该方法将失败:

MyClass.h

// Forward declare the enum in Objective-C
typedef NS_ENUM(NSInteger, MyEnum);

@interface MyClass : NSObject

-(void)method:(MyEnum)param;

@end

SubClass.swift

@objc enum MyEnum: NSInteger {
  case case1
}

class SubClass: MyClass {
  override func method(_ param: MyEnum) {} // Error
}

在这种情况下,覆盖方法失败,并显示错误

  

方法不会覆盖其超类中的任何方法

枚举本身可以在Swift中工作,我可以在SubClass中添加以下方法,然后进行编译:

func useEnum() {
  let x = MyEnum.case1
}

为什么覆盖失败?

1 个答案:

答案 0 :(得分:1)

当我打开MyClass.h的Generated Interface时,Xcode显示如下内容:

import Foundation

open class MyClass : NSObject {
}

仅此而已。

似乎 Swift无法导入不完整的枚举,因此使用这种类型的方法也不会导入。

因此,您的@objc enum MyEnum仅声明了一个新的枚举类型,而override func method(_ param: MyEnum)试图从Swift方面覆盖其超类中不存在的方法。

枚举本身可在Swift中工作

当然。即使从MyClass.h中删除了typedef的行(所有行都使用了该行),枚举仍然起作用。

即使您指定的类型与NSInteger不同,枚举仍然有效:

@objc enum MyEnum: UInt8 {
    case case1
}

似乎您无法在Swift中编写枚举的实际定义,而在Objective-C中它被声明为不完整的枚举。