Хранение типа 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 мог быть установлен при создании экземпляра, если это вообще возможно).

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