Objc видимое строковое перечисление, но не RawRepresentable - PullRequest
1 голос
/ 04 апреля 2019

Я хочу использовать enum, который виден как в цели C, так и в Swift, но не соответствует протоколу RawRepresentable.

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

    typedef NSString *myEnum NS_TYPED_ENUM;

  2. Я пытался воспользоваться myEnum (rawValue:) -> myEnum? функция, но я обнаружил, что enumType автоматически соответствует

    public struct myEnum : Hashable, Equatable, RawRepresentable { public init(rawValue: String) }

Мой вопрос заключается в том, как создать enum, видимый в Objc и Swift, но не соответствующий этому протоколу? Спасибо за помощь!

1 Ответ

1 голос
/ 04 апреля 2019

Улучшения языка Swift

... Перечисления Swift теперь можно экспортировать в Objective-C с помощью @objc приписывать. Перечисления @objc должны объявлять целочисленный тип raw и не могут быть общие или использовать связанные значения. Поскольку перечисления Objective C не в пространстве имен регистр перечислений импортируется в Objective-C как объединение имен enum и case.

выше Замечания к выпуску Xcode 6.4


Для этого вы определяете значения в Objective-C, вы можете использовать макрос NS_TYPED_ENUM для импорта констант в Swift Например: .h файл

typedef NSString *const ProgrammingLanguage NS_TYPED_ENUM;

FOUNDATION_EXPORT ProgrammingLanguage ProgrammingLanguageSwift;
FOUNDATION_EXPORT ProgrammingLanguage ProgrammingLanguageObjectiveC;

.m файл

ProgrammingLanguage ProgrammingLanguageSwift = "Swift";
ProgrammingLanguage ProgrammingLanguageObjectiveC = "ObjectiveC";

В Swift это импортируется как структура как таковая:

struct ProgrammingLanguage: RawRepresentable, Equatable, Hashable {
    typealias RawValue = String

    init(rawValue: RawValue)
    var rawValue: RawValue { get }

    static var swift: ProgrammingLanguage { get }
    static var objectiveC: ProgrammingLanguage { get }
}

Несмотря на то, что тип не является мостовым, как перечисление, он очень похож на тип при использовании его в коде Swift.

Подробнее об этом методе вы можете прочитать в " Взаимодействие с C APIs " Использование Swift с Какао и документации Objective-C

...