ジェネリックスを介してオブジェクトのマージを迅速に実現するにはどうすればよいですか?

Quantaliinuxite

私がクラス番号を持っていると想像してください:

class Number {
    var val: Double?
}

そして、そのクラスの2つのインスタンスがAありBます。今、私が次のようなステートメントを通じてマージBたいと想像Aしてください

merge(B, into: A)

もちろん、次のような関数を書くことができます。

func merge(from: Number, into: Number){
    into.val = from.val
}

しかし、それはまったく再利用できません。汎用マージクラスを作成する方法はありますか?

更新:いくつかの回答は優れた実行可能な解決策を提供しますが、それらのどれも十分に「一般的」ではありません(ここでの一般的は非技術的な方法で意味されます)それで答えを見て、私はいくつかのインスピレーションを得ました、そしてここに解決策があります現在検討中です。NumberをNSObjectサブクラスにし、マージできるすべてのプロパティを動的として宣言します。例えば:

class Number: NSObject {
    //Put the required init and initWithCoder: here
    dynamic var val: Double?
}

次に、マージ可能なクラスが尊重しなければならないプロトコルを宣言します

protocol Mergeable: class {
    var mergeablePropertyKeys:[String] {get}
}

次に、マージを実行するグ​​ローバル関数を宣言します。

func merge<U: Mergeable, Mergeable where U.Type == V.Type>(from: U, into:V){
    for property in U.mergeablePropertyKeys {
        V.setValue(U.valueForKey(property), property)
    }
}

そして、マージする引数が必ずしもそうではないので、これが機能しないことを私は知っていNSObjectsます。

  • の引数mergeが両方であることを確認するにはどうすればよいですかNSObjects?
  • オブジェクトの動的な値のリストを取得するだけで、すべてのマージ可能な値の名前を指定する必要がなくなりますか?
lehn0058

必要なのは、リフレクションを使用してプロパティをマージする汎用関数のようです。Swiftでは反射が制限されていますが、MirrorTypeを使用して実行できます。私は以前にこのメソッドを使用して、一般的なjsonパーサーをswiftで構築しました-同様のことを行うことができますが、json辞書をプロパティに解析する代わりに、2つのオブジェクトのプロパティをマップします。

リフレクションを使用してこれを迅速に行う例:

func merge<T>(itemToMerge:T) {
    let mirrorSelf = Mirror(reflecting: self)
    let mirrorItemToMerge = Mirror(reflecting: itemToMerge)
    for mirrorSelfItem in mirrorSelf.children {
        // Loop through items in mirrorItemToMerge.
        for mirrorImageItem in mirrorItemToMerge.children {
            // If you have a parameter who's name is a match, map the value
            // OR You could add any custom mapping logic you need for your specific use case
            if mirrorSelfItem.label == mirrorImageItem.label {
                // To set values, use self.setValue(valueToSet, forKey: propertyName)
                self.setValue(mirrorImageItem.value as? AnyObject, forKey: mirrorImageItem.label!)
            }
        }
    }
}

これは、マージメソッドを定義するオブジェクトがNSObjectのサブクラスであることを前提としています(したがって、NSKeyValueCodingを利用できます)。これを静的メソッドにして、任意のNSObjectタイプの任意の2つのオブジェクトをマージすることもできます。

static func merge<T1: NSObject, T2: NSObject>(itemChanging:T1, itemToMerge:T2) {
    let mirrorSelf = Mirror(reflecting: itemChanging)
    let mirrorItemToMerge = Mirror(reflecting: itemToMerge)
    for mirrorSelfItem in mirrorSelf.children {
        // Loop through items in mirrorItemToMerge.
        for mirrorImageItem in mirrorItemToMerge.children {
            // If you have a parameter who's name is a match, map the value
            // OR You could add any custom mapping logic you need for your specific use case
            if mirrorSelfItem.label == mirrorImageItem.label {
                // To set values, use self.setValue(valueToSet, forKey: propertyName)
                self.setValue(mirrorImageItem.value as? AnyObject, forKey: mirrorImageItem.label!)
            }
        }
    }
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Typescriptで、ジェネリックコンテナタイプのオブジェクトをオブジェクトタイプのジェネリックコンテナにマージするにはどうすればよいですか?

分類Dev

匿名オブジェクトをジェネリックパラメータとして指定するにはどうすればよいですか?

分類Dev

文字列フォーマット関数を使用してオブジェクトの表現を印刷するにはどうすればよいですか?

分類Dev

オブジェクト内のすべてのフィールドが存在するかどうかが不明なときに、オブジェクト配列を介してマッピングするにはどうすればよいですか?

分類Dev

オブジェクトを別のオブジェクトのリストに追加して JSF で保持するにはどうすればよいですか?

分類Dev

オブジェクトのマップをストリーミングして、新しいオブジェクトの単一のリストにフラット化するにはどうすればよいですか?

分類Dev

オブジェクトをドラッグせずにクリックして、シーンビューのマウスポイントにオブジェクトを作成するにはどうすればよいですか?

分類Dev

リストにジェネリックオブジェクトのプロパティを設定するにはどうすればよいですか?

分類Dev

Tkinterを使用して1つのフレーム内に複数のフレームをネストしようとしています。オブジェクト指向でこれを実現するにはどうすればよいですか?

分類Dev

TypeScriptでジェネリックを使用して宣言されたいくつかのオブジェクトメソッドをマージするにはどうすればよいですか?

分類Dev

C#ジェネリックを使用してクラスのオブジェクトをタイプTのオブジェクトに変換するにはどうすればよいですか?

分類Dev

ネストされたリストをマトリックスのようなオブジェクトまたは表のようなオブジェクトにキャストするにはどうすればよいですか?

分類Dev

ジェネリックを宣言したArrayListに複数のオブジェクトを追加するにはどうすればよいですか?

分類Dev

AutoMapperを使用して、宛先オブジェクトをソースオブジェクトの子オブジェクトにマップするにはどうすればよいですか?

分類Dev

MongoDBのオブジェクトを部分的に更新して、新しいオブジェクトが既存のオブジェクトとオーバーレイ/マージされるようにするにはどうすればよいですか?

分類Dev

ネストされたオブジェクトのリストをDapperでマップするにはどうすればよいですか

分類Dev

ページ上のボタンをクリックしてオブジェクトを取得するにはどうすればよいですか?

分類Dev

JavaSwingでオブジェクト指向の概念を実現するにはどうすればよいですか

分類Dev

ジェネリッククラスオブジェクトを作成するメソッドを作成するにはどうすればよいですか?

分類Dev

JAXBを使用してJavaでネストされたXMLオブジェクトのリストを解析するにはどうすればよいですか?

分類Dev

リフレクションを介してオブジェクトのフィールドを取得するにはどうすればよいですか?

分類Dev

Reactフック:useState()を使用してネストされたオブジェクトの状態を更新するにはどうすればよいですか?

分類Dev

マップ付きのキー名をネストされたオブジェクトに変更するにはどうすればよいですか?

分類Dev

ネットワークオブジェクトのリストに属性を添付するにはどうすればよいですか?

分類Dev

JacksonとSpringのモジュールを使用してオブジェクトマッパーを設定するにはどうすればよいですか

分類Dev

React:キー名なしでネストされたJSONオブジェクトをマッピングするにはどうすればよいですか?

分類Dev

デスクトップC#アプリでオブジェクトクラスの名前をルートとして追加するJsonとしてオブジェクトをシリアル化するにはどうすればよいですか?

分類Dev

lodashマップがネストされたオブジェクトを作成しないようにするにはどうすればよいですか?

分類Dev

それを実装する具象型へのインターフェースによって表される「ジェネリック」オブジェクトのリストからキャストへの(List <?>)とはどういう意味ですか?

Related 関連記事

  1. 1

    Typescriptで、ジェネリックコンテナタイプのオブジェクトをオブジェクトタイプのジェネリックコンテナにマージするにはどうすればよいですか?

  2. 2

    匿名オブジェクトをジェネリックパラメータとして指定するにはどうすればよいですか?

  3. 3

    文字列フォーマット関数を使用してオブジェクトの表現を印刷するにはどうすればよいですか?

  4. 4

    オブジェクト内のすべてのフィールドが存在するかどうかが不明なときに、オブジェクト配列を介してマッピングするにはどうすればよいですか?

  5. 5

    オブジェクトを別のオブジェクトのリストに追加して JSF で保持するにはどうすればよいですか?

  6. 6

    オブジェクトのマップをストリーミングして、新しいオブジェクトの単一のリストにフラット化するにはどうすればよいですか?

  7. 7

    オブジェクトをドラッグせずにクリックして、シーンビューのマウスポイントにオブジェクトを作成するにはどうすればよいですか?

  8. 8

    リストにジェネリックオブジェクトのプロパティを設定するにはどうすればよいですか?

  9. 9

    Tkinterを使用して1つのフレーム内に複数のフレームをネストしようとしています。オブジェクト指向でこれを実現するにはどうすればよいですか?

  10. 10

    TypeScriptでジェネリックを使用して宣言されたいくつかのオブジェクトメソッドをマージするにはどうすればよいですか?

  11. 11

    C#ジェネリックを使用してクラスのオブジェクトをタイプTのオブジェクトに変換するにはどうすればよいですか?

  12. 12

    ネストされたリストをマトリックスのようなオブジェクトまたは表のようなオブジェクトにキャストするにはどうすればよいですか?

  13. 13

    ジェネリックを宣言したArrayListに複数のオブジェクトを追加するにはどうすればよいですか?

  14. 14

    AutoMapperを使用して、宛先オブジェクトをソースオブジェクトの子オブジェクトにマップするにはどうすればよいですか?

  15. 15

    MongoDBのオブジェクトを部分的に更新して、新しいオブジェクトが既存のオブジェクトとオーバーレイ/マージされるようにするにはどうすればよいですか?

  16. 16

    ネストされたオブジェクトのリストをDapperでマップするにはどうすればよいですか

  17. 17

    ページ上のボタンをクリックしてオブジェクトを取得するにはどうすればよいですか?

  18. 18

    JavaSwingでオブジェクト指向の概念を実現するにはどうすればよいですか

  19. 19

    ジェネリッククラスオブジェクトを作成するメソッドを作成するにはどうすればよいですか?

  20. 20

    JAXBを使用してJavaでネストされたXMLオブジェクトのリストを解析するにはどうすればよいですか?

  21. 21

    リフレクションを介してオブジェクトのフィールドを取得するにはどうすればよいですか?

  22. 22

    Reactフック:useState()を使用してネストされたオブジェクトの状態を更新するにはどうすればよいですか?

  23. 23

    マップ付きのキー名をネストされたオブジェクトに変更するにはどうすればよいですか?

  24. 24

    ネットワークオブジェクトのリストに属性を添付するにはどうすればよいですか?

  25. 25

    JacksonとSpringのモジュールを使用してオブジェクトマッパーを設定するにはどうすればよいですか

  26. 26

    React:キー名なしでネストされたJSONオブジェクトをマッピングするにはどうすればよいですか?

  27. 27

    デスクトップC#アプリでオブジェクトクラスの名前をルートとして追加するJsonとしてオブジェクトをシリアル化するにはどうすればよいですか?

  28. 28

    lodashマップがネストされたオブジェクトを作成しないようにするにはどうすればよいですか?

  29. 29

    それを実装する具象型へのインターフェースによって表される「ジェネリック」オブジェクトのリストからキャストへの(List <?>)とはどういう意味ですか?

ホットタグ

アーカイブ