私のライブラリ(https://github.com/JiriTrecak/Warp)の列挙型のシリアル化に取り組んでいます。プロパティに列挙型を格納するのに苦労しました(必要に応じてシリアル化/デシリアライズできるようにその型を知る必要があります) 。スウィフトに列挙型を格納する
私はあなたが持つことができるすべてのプロパティの種類、リモートキーなどの記述を含む構造体を持っています。これはEnum型キーが見つかったときに作成される(例えば、Gender)。
私は使用できませんどちらも二つのアプローチ、試してみた:このアプローチの問題は、これが機能する
public struct WRPProperty<T: RawRepresentable> {
var enumType : T?
public init(remote : String, enumType: T) {
self.enumType = enumType
}
}
コンテナ定義でジェネリック型を宣言し
Aを)私はすべてのWRPPropertyにenumを持たせたくありません。このように宣言することで、プロパティの作成時に常にデータ型を追加することが強制されます。これは不要な動作です。 WRPEnumPropertyとなるオブジェクトを作成することもできますが、ライブラリがこれらの定義をどのように処理し、どのように定義するかによって使用できません。 RawRepresentableは唯一の一般的な制約として使用することができるので
B)は、initメソッドは動作しません
public struct WRPProperty {
var enumType : RawRepresentable
public init<T: RawRepresentable>(remote : String, enumType: T) {
self.enumType = enumType
}
}
でジェネリック型を宣言します。
私の質問は、どのようにenum型を格納できるのですか?だから、いつでもその型のEnumを作成できますか? (またSwift 2.2を使用しています)
しかし、それをAnyとして保存すると、初期値を持たない(そのプロトコルに準拠する必要があるとわからないため)Raw値で割り当てることができず、強制的にキャストできません、becaues Anyはこのように変換できません。私は何かを欠いている? –
私はあなたがここで何を意味しているか正確にはわかりません。次のようにキャストすることができます: 'wrp.enumType as? WRPEnum'に 'wrp.enumType = WRPEnum(rawValue:1)'を割り当てることもできます。何も起こらないのは、enumTypeが常にinit型Tと同じであることを保証するためにジェネリックを利用することです。代わりに、enumTypeがどの型かをテストする必要があります。 – sketchyTech
ありがとう、とても助かりました。私はいくつかのことがどう扱われているのか考え直さなければならないでしょう。解決策はうまくいくが、非常にハッキーであり、いくつかの中核的な概念が変わることを意味しても、むしろより良い時間を過ごすだろう。 –