Переопределение Obj-C-методов в Swift с использованием перечислений Swift - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть следующий класс 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

Я могу создать подкласс MyClass в Swift и переопределить метод следующим образом:

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, я могу добавить следующий метод в подкласс и скомпилировать:

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

Почему не удается переопределить?

1 Ответ

0 голосов
/ 27 сентября 2018

Когда я открыл сгенерированный интерфейс MyClass.h, Xcode показал что-то вроде этого:

import Foundation

open class MyClass : NSObject {
}

Ничего больше, кроме комментариев.

Кажется Swift не может импортировать неполные перечисления , поэтому методы, использующие такие типы, также не импортируются.

Итак, ваш @objc enum MyEnum просто объявляет новый тип перечисления, а override func method(_ param: MyEnum) является попыткой переопределить метод, который не существует в егосуперкласс, со стороны Swift.

Само перечисление работает в Swift

Конечно.Перечисление работает, даже если вы удалили строку typedef (со всеми использующими ее строками) из MyClass.h.

Перечисление работает, даже если вы указали тип, отличный от NSInteger:

@objc enum MyEnum: UInt8 {
    case case1
}

Похоже, вы не можете написать фактическое определение перечисления в Swift, которое объявлено как неполное перечисление в Objective-C.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...