Подтвердить что ты не робот

Как ссылаться на перечисление Swift в заголовке Objective-C

Есть ли способ ссылаться на перечисление Swift из заголовка Objective-C? Если вы хотите видеть классы Swift в заголовке Objective-C, вы можете использовать

@objc class Foo

Я не вижу ничего подобного для перечислений.

4b9b3361

Ответ 1

То, что вы хотите сделать, называется forward declaration. Чтобы переслать объявление перечисления, которое вы можете сделать:

enum name;

Но поскольку компилятор не будет знать размер перечисления, вы сможете использовать его только как указатель в своем заголовочном файле. Даже выполнение этого может оказаться проблематичным, если вы используете флаги компилятора, такие как -pedantic.

Короче говоря, нет хорошего способа сделать это. Лучше всего не делать этого и вместо него обращаться к перечислению из файла вашей реализации (.m).

В вашем файле реализации #import ваш быстрый заголовочный файл, и, не зная подробностей о вашей проблеме, вы можете добавить частные свойства, которые используют ваше перечисление следующим образом:

@interface MyObjCClassDefinedInTheHFile()
    @property (nonatomic, assign) SomeSwiftEnum type;
@end

Надеюсь, что это поможет.

Ответ 2

typedef SWIFT_ENUM(NSInteger, MyEnum);

Ответ 3

В смешанных проектах OBJC - Swift лучший способ работы с перечислениями в обоих типах классов будет определять перечисление в заголовке OBJC, а не в быстром классе. Быстрые перечисления не могут использоваться в заголовочных файлах OBJC взято из ответа здесь

Ответ 4

перечисления являются частью быстрой связи Objective-C, которая не всегда работает. Дело в том, что в Objective-C перечисления могут быть просто примитивными типами (NSInteger например).

В swift вы можете иметь перечисления для большего количества типов, например, как String. Это одна из удивительных вещей о быстрой.

Однако эти перечисления не будут скомпилированы в Objective-C, потому что для них нет эквивалента. Поэтому они просто игнорируются и не генерируются в этом заголовочном файле, который создает xcode для всех ваших быстрых файлов. Это называется Objective-C сгенерированным заголовком интерфейса: введите описание изображения здесь

Этот сгенерированный файл содержит все классы и перечисления, доступные в Objective-C. Вы должны отметить все, что вы хотите открыть в Objective-C с помощью @objc или сделать их public. Вам не нужно форвардное объявление для их работы, если у вас есть это.

Надеюсь, это поможет вам понять, почему ваш перечислитель не отображается в Objc. Дайте мне знать, если это сработает.

Ответ 5

Я нашел немного сложное решение, но оно хорошо работает в моем случае.

  1. Я сделал протокол Swift.
  2. Включено желаемое быстрое свойство в нем
  3. Предопределенный протокол, использующий @protocol в заголовочном файле
  4. Сделанный класс соответствует этому протоколу
  5. Наконец я получил доступ к этому свойству от Objective-C & Swift

Ответ 6

Насколько я могу судить, raf answer по-прежнему верен. Самое чистое решение состоит в том, чтобы просто оставить свой список в файле Objective-C, пока вам больше не нужно будет обращаться к нему из заголовка Objective-C. Однако я хотел предложить еще одно возможное решение.

В моем случае я постепенно переписываю большой проект Objective-C в Swift, и я не против несовершенного обходного пути, если он позволяет мне переписать еще мой код в Swift. Поэтому я решил просто передать enum в Objective-C как это необработанный тип, Int или NSInteger до Objective-C. Например:

- (void)doSomethingWithType:(NSInteger)rawType {
    if (rawType == ExampleTypeWhatever) {
        // Do something
    } // etc...
}

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

objcObject.doSomething(withType: ExampleType.whatever.rawValue)

Это делает вещи довольно простыми с обеих сторон, и будет легко обновляться после того, как doSomethingWithType: в конечном итоге будет перезаписано в Swift.

Ответ 7

Я просто использую NSInteger как возвращаемый тип для файлов заголовка и реализации. И когда вам нужно использовать перечисление, получите перечисление let yourEnum = YourEnum(rawValue: Int(enumNSInteger)). Это работает для меня.

Ответ 8

Вы можете получить доступ к спискам Swift в Objective-C, но только если объявление перечислено с помощью квалификатора @objc, что означает, что оно должно быть типа Int.