Objc видимое строковое перечисление, но не RawRepresentable

Я хочу использовать 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 ответ

Решение

Быстрые улучшения языка

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

Выше Из 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.

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

Другие вопросы по тегам