【问题标题】:Overriding Obj-C-methods in Swift using Swift enums使用 Swift 枚举覆盖 Swift 中的 Obj-C 方法
【发布时间】:2018-09-27 15:28:52
【问题描述】:

我有以下使用 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
}

为什么覆盖失败?

【问题讨论】:

    标签: objective-c swift enums


    【解决方案1】:

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

    import Foundation
    
    open class MyClass : NSObject {
    }
    

    只有 cmets。

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

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

    枚举本身在 Swift 中工作

    当然。即使您从 MyClass.h 中删除了 typedef 行(所有行都使用它),枚举仍然有效。

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

    @objc enum MyEnum: UInt8 {
        case case1
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-31
      • 1970-01-01
      • 2016-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-14
      相关资源
      最近更新 更多