Есть ли способ ссылаться на перечисление Swift из заголовка Objective-C? Если вы хотите видеть классы Swift в заголовке Objective-C, вы можете использовать
@objc class Foo
Я не вижу ничего подобного для перечислений.
Есть ли способ ссылаться на перечисление Swift из заголовка Objective-C? Если вы хотите видеть классы Swift в заголовке Objective-C, вы можете использовать
@objc class Foo
Я не вижу ничего подобного для перечислений.
То, что вы хотите сделать, называется forward declaration
. Чтобы переслать объявление перечисления, которое вы можете сделать:
enum name;
Но поскольку компилятор не будет знать размер перечисления, вы сможете использовать его только как указатель в своем заголовочном файле.
Даже выполнение этого может оказаться проблематичным, если вы используете флаги компилятора, такие как -pedantic
.
Короче говоря, нет хорошего способа сделать это. Лучше всего не делать этого и вместо него обращаться к перечислению из файла вашей реализации (.m).
В вашем файле реализации #import
ваш быстрый заголовочный файл, и, не зная подробностей о вашей проблеме, вы можете добавить частные свойства, которые используют ваше перечисление следующим образом:
@interface MyObjCClassDefinedInTheHFile()
@property (nonatomic, assign) SomeSwiftEnum type;
@end
Надеюсь, что это поможет.
typedef SWIFT_ENUM(NSInteger, MyEnum);
В смешанных проектах OBJC - Swift лучший способ работы с перечислениями в обоих типах классов будет определять перечисление в заголовке OBJC, а не в быстром классе. Быстрые перечисления не могут использоваться в заголовочных файлах OBJC взято из ответа здесь
перечисления являются частью быстрой связи Objective-C, которая не всегда работает. Дело в том, что в Objective-C перечисления могут быть просто примитивными типами (NSInteger
например).
В swift
вы можете иметь перечисления для большего количества типов, например, как String
. Это одна из удивительных вещей о быстрой.
Однако эти перечисления не будут скомпилированы в Objective-C, потому что для них нет эквивалента. Поэтому они просто игнорируются и не генерируются в этом заголовочном файле, который создает xcode для всех ваших быстрых файлов.
Это называется Objective-C сгенерированным заголовком интерфейса:
Этот сгенерированный файл содержит все классы и перечисления, доступные в Objective-C. Вы должны отметить все, что вы хотите открыть в Objective-C с помощью @objc
или сделать их public
. Вам не нужно форвардное объявление для их работы, если у вас есть это.
Надеюсь, это поможет вам понять, почему ваш перечислитель не отображается в Objc. Дайте мне знать, если это сработает.
Я нашел немного сложное решение, но оно хорошо работает в моем случае.
Насколько я могу судить, 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.
Я просто использую NSInteger
как возвращаемый тип для файлов заголовка и реализации. И когда вам нужно использовать перечисление, получите перечисление let yourEnum = YourEnum(rawValue: Int(enumNSInteger))
. Это работает для меня.
Вы можете получить доступ к спискам Swift в Objective-C, но только если объявление перечислено с помощью квалификатора @objc
, что означает, что оно должно быть типа Int
.