Хранение типа Enum в Swift
Я работаю над сериализацией Enum для моей библиотеки ( https://github.com/JiriTrecak/Warp), и я немного застрял при хранении типа enum в свойстве (мне нужно знать этот тип, чтобы я мог сериализовать / десериализовать его в потребность).
У меня есть структура, которая содержит описание всех свойств, которые вы можете иметь, включая их тип, удаленные ключи и т. Д., И я хотел бы сохранить еще одну необязательную информацию, если это enum, то есть тип Enum, который создается при ключ найден (скажем, пол).
Я пробовал два подхода, оба из которых не могут быть использованы:
А) Объявите универсальный тип в определении контейнера
public struct WRPProperty<T: RawRepresentable> {
var enumType : T?
public init(remote : String, enumType: T) {
self.enumType = enumType
}
}
Это работает, проблема с этим подходом состоит в том, что я не хочу, чтобы у каждого WRPProperty был enum. Объявив его таким образом, он заставляет пользователя всегда добавлять тип данных при создании свойства, что является нежелательным поведением. Я также могу создать объект, который будет WRPEnumProperty, но его нельзя использовать из-за того, как библиотека обрабатывает эти определения и как пользователь определяет их.
Б) Объявить универсальный тип в методе init
public struct WRPProperty {
var enumType : RawRepresentable
public init<T: RawRepresentable>(remote : String, enumType: T) {
self.enumType = enumType
}
}
Что не работает, потому что RawRepresentable может использоваться только в качестве общего ограничения.
Итак, мой вопрос, как я могу сохранить тип enum, чтобы я мог затем создать любой Enum этого типа в любой точке? (Также я использую Swift 2.2)
1 ответ
В вашем примере (B), даже если компилятор разрешил это, не было бы никакого способа гарантировать, что init enumType был таким же, как свойство enumType.
Единственное решение, которое я могу придумать в этой ситуации, - это игнорировать безопасность и использование типов. Any
public struct WRPProperty {
var enumType:Any?
public init<T:RawRepresentable>(remote : String, enumType: T) {
self.enumType = enumType
}
}
если вы не можете найти какой-нибудь умный способ обернуть ваши значения или использовать более сложное стирание типов. Это дает вам динамические возможности, которые вы ищете (хотя наилучшее решение, вероятно, состоит в том, чтобы реструктурировать ваш подход так, чтобы тип enum мог быть установлен при создании экземпляра, если это вообще возможно).