2017-12-21 14 views
2

同じフィールドを持つ構造体が2つあります。それらをマージする最良の方法は何ですか。あるタイプの構造体を別のタイプに変更する

struct Type1{ 
    var variable1:String?  
    var variable2:Double? 
    var variable3:String? 

    var notImporant:String? 
} 

struct Type2{ 
    var variable1A:String?  
    var variable2A:String? 
    var variable3A:String! 
} 

type1type2を変換するための最良の方法は何ですか?私はAPIからのリターンを得て、コード化可能なものを使用して解析していますが、2つの異なる構造体があり、構造体を1つ取得する必要があります。データは同じで、型の点で異なってマッピングされています。いくつかの構造体はより多くの情報を持ち、他の構造体は少ない。

+1

実際には構造体に**同じ*フィールドが含まれていない* – vadian

+0

異なるタイプかもしれませんが、値は似ています。たとえば、価格はintか文字列かにかかわらず常に価格になります。私は彼らが同じ分野を持っていることについて話しているわけではありませんが、すべての目的と目的のために同じです –

+0

もう1つはパラメータとしてもう一方を取るイニシャライザを与えます – matt

答えて

2

はちょうどそうのように両方の構造体にコピーコンストラクタを作る:

struct Type2 { 
    var variable1A:String?  
    var variable2A:String? 
    var variable3A:String! 
    init(_ otherType: Type1) { 
    variable1A = otherType.variable1 
    variable2A = otherType.variable2 
    variable3A = otherType.variable3 
    } 
} 
+1

' otherType.variable2'を変換する必要があります。 –

+0

@PhillipMills鋭い目、私の編集を編集する気軽に:) – matt

2

あなたは2つの無関係な構造体をキャストすることはできません。あなたができることは、それらの2つの共通のプロトコルを定義し、それがどの基本オブジェクトであるかを気にしない場所で使用することです。

protocol CommonProtocol { 
    var variable1: String? { get } 
    var variable3: String? { get } 
} 

struct Type1: CommonProtocol { 

    var variable1:String?  
    var variable2:Double? 
    var variable3:String? 

    var notImporant:String? 
} 

struct Type2: CommonProtocol { 

    var variable1A:String?  
    var variable2A:String? 
    var variable3A:String! 

} 

次に、あなたが現在type2の代わりにtype1で立ち往生している方の場所で、だけではなく、CommonProtocolを受け入れ、あなたがいずれかを使用することができ、その機能を持っています。

両方のタイプにvariable2がありますが、そのうちの1つはDouble?で、もう1つはString?です。それにアプローチする方法はいくつかありますが、私はそれをあなたに任せています。私はちょうどプロトコルのそれを残しました。

構造体の名前(Type1Type2)を大文字にするのは、Swift標準です。場合によっては、そうしないと問題に遭遇する可能性があるので、私はあなたに勧めます。

+0

これはコード可能で使用できますか?私がこれをしなくてはならない理由は、コード化可能なものを使用しているからです。 –

+0

間違いなく。何かを変更する必要がある場合は、インポートするロジックによって異なります。具体的な型( 'Type1'、' Type2')としてすべてを_instantiate_できれば、そのままにしておいてください。 JSONから何か_instantiate_何か_Type1'または 'Type2'かもしれない場合は、JSONにあなたがどのタイプであるかを示す追加のフィールドが必要です。これで、以前と同じようにCodableで初期化できます。 – Connor

関連する問題