我有以下使用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
}
为什么覆盖失败?
答案 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中它被声明为不完整的枚举。