Objc видимое строковое перечисление, но не RawRepresentable
Я хочу использовать enum, который виден как в цели C, так и в Swift, но не соответствует протоколу RawRepresentable.
Я попытался получить перечисление строк, видимых в Objc и Swift, поэтому я использую
typedef NSString *myEnum NS_TYPED_ENUM;
Я пытался воспользоваться 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