[Ios] Swift: comment combiner deux instances de dictionnaire?


Answers

Pour Swift> = 2.2:
let parameters = dict1.reduce(dict2) { r, e in var r = r; r[e.0] = e.1; return r }

Pour Swift <2.2:
let parameters = dict1.reduce(dict2) { (var r, e) in r[e.0] = e.1; return r }

Il est vraiment important de creuser autour de la bibliothèque standard: map , reduce , dropFirst , forEach etc. sont des agrafes de code laconique. Les bits fonctionnels sont amusants!

Question

Comment ajouter un [Dictionary] à un autre [Dictionary] utilisant Swift ?

J'utilise la bibliothèque AlamoFire pour envoyer un JSON à un REST server .

Dictionnaire 1

let dict1: [String: AnyObject] = [
            kFacebook: [
                kToken: token
            ]
        ]

Dictionnaire 2

let dict2: [String: AnyObject] = [
        kRequest: [
            kTargetUserId: userId
        ]
    ]

Comment combiner les deux dictionnaires pour créer un nouveau dictionnaire comme indiqué ci-dessous?

let parameters: [String: AnyObject] = [
        kFacebook: [
            kToken: token
        ],
        kRequest: [
            kTargetUserId: userId
        ]
    ]

J'ai essayé dict1 += dict2 mais j'ai eu une erreur de compilation.

Merci d'avance!




SequenceType.forEach (implémenté par Dictionary ) fournit une solution élégante pour ajouter les éléments d'un dictionnaire à un autre dictionnaire.

dic1.forEach { dic2[$0] = $1 }

Par exemple

func testMergeDictionaries() {
    let dic1 = [1:"foo"]
    var dic2 = [2:"bar"]

    dic1.forEach { dic2[$0] = $1 }

    XCTAssertEqual(dic2[1], "foo")
}



Essayez cette approche

    let dict1: [String: AnyObject] = ["kFacebook": ["kToken": "token"]]
    let dict2: [String: AnyObject] = ["kRequest": ["kTargetUserId": "userId"]]

    var combinedAttributes : NSMutableDictionary!

    combinedAttributes = NSMutableDictionary(dictionary: dict1)

    combinedAttributes.addEntriesFromDictionary(dict2)

    println(combinedAttributes)

Il imprimera suit:

{
kFacebook =     {
    kToken = token;
};
kRequest =     {
    kTargetUserId = userId;
};

}

J'espère que cela aide !!




Vous utilisez le mot-clé let pour déclarer le dictionnaire afin que vous ne puissiez pas apporter les modifications à votre dictionnaire car il est utilisé pour déclarer constant.

Changez-le en mot-clé var, cela fonctionnera pour vous.

var dict1: [String: AnyObject] = [
            kFacebook: [
                kToken: token
            ]
        ]

var dict2: [String: AnyObject] = [
        kRequest: [
            kTargetUserId: userId
        ]
    ]

dict1 += dict2