2016-06-21 18 views
0

私のライブラリ(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を使用しています)

答えて

1

コンパイラが許可していても、init enumTypeがenumTypeプロパティと同じであることを保証する方法はありません。あなたは自分の価値観を包むか、より洗練されたtype erasureを採用したいくつかの巧妙な方法を見つけることができない限り、私はこのような状況であると考えることができ

唯一の解決策は、型の安全性を無視してAny

public struct WRPProperty { 
    var enumType:Any? 
    public init<T:RawRepresentable>(remote : String, enumType: T) { 
     self.enumType = enumType 
    } 
} 

を使用することです。これは、あなたが探している動的な能力を提供します(できるだけ、インスタンス化時にenum Typeを設定できるように、おそらく最良の解決策はアプローチを再構成することです)。

+0

しかし、それをAnyとして保存すると、初期値を持たない(そのプロトコルに準拠する必要があるとわからないため)Raw値で割り当てることができず、強制的にキャストできません、becaues Anyはこのように変換できません。私は何かを欠いている? –

+0

私はあなたがここで何を意味しているか正確にはわかりません。次のようにキャストすることができます: 'wrp.enumType as? WRPEnum'に 'wrp.enumType = WRPEnum(rawValue:1)'を割り当てることもできます。何も起こらないのは、enumTypeが常にinit型Tと同じであることを保証するためにジェネリックを利用することです。代わりに、enumTypeがどの型かをテストする必要があります。 – sketchyTech

+0

ありがとう、とても助かりました。私はいくつかのことがどう扱われているのか考え直さなければならないでしょう。解決策はうまくいくが、非常にハッキーであり、いくつかの中核的な概念が変わることを意味しても、むしろより良い時間を過ごすだろう。 –

関連する問題