2016-08-11 4 views
1

두 개의 사전 중 배열에 키가 들어있는 사전이나 값으로 다른 사전을 결합하는 방법이 궁금합니다.두 개의 복잡한 사전을 결합하는 방법

예 :

var dict1 = ["bbb":"dict1", 
       "her": "dict1"] 

    let dict2 = ["aaa":"dict2", 
       "her": "doct2", 
       "bob": "doct2"] 

    dict1 += dict2 // result is as I expected 


    func += <K, V> (inout left: [K:V], right: [K:V]) { 
     for (k, v) in right { 
      left.updateValue(v, forKey: k) 
     } 
    } 

하지만 더 복잡한 사전을 결합하려는 경우 문제가 발생합니다.

var dict1 = ["bbb":"dict1", 
      "her": "dict1"] 


let complexDict2 = ["aaa":"dict2", 
        "her": "dict2", 
        "arr": ["one", "two"]] 


dict1 += complexDict2 // in here method which override '+=' operator for dictionaries does not work anymore... 

제 질문은 여러분이 더 복잡한 사전을 결합하여 입증 된 방법인지 여부입니다. 결합 dict1과 complexDict2에서

Upadate

내 예상 된 결과는 다음과 같습니다

let resultDict = ["aaa":"dict1", 
        "aaa":"dict2", 
        "her": "dict2", 
        "arr": ["one", "two"]] 
+1

원하는 결과가 무엇을, 어떻게 실제 결과의 차이점은 무엇입니까? –

+2

거의 사전에 사전을 보았을 때마다 중첩 된 구조체를 사용해야하는 끔찍한 똥똥 거리기가되었습니다. 나는 이것에 신중할 것이다. – Alexander

+0

이것은 [Minimal, Complete, and Verifiable example] (http://stackoverflow.com/help/mcve)이 아닙니다. 하나의 중요한 누락 된 구성 요소는'complexDict'가 유추 된 타입'[String : NSObject]'을 갖기 위해'import foundation'을 가져야 만한다는 것입니다. 그렇지 않으면 "표현의 타입이 더 많은 컨텍스트없이 모호합니다"라는 오류가 발생합니다. 일반적으로 놀이터에서 코드를 무대에 올려 놓은 다음 놀이터에서 코드를 게시하는 것이 좋습니다. – ColGraff

답변

2

문제는 여기 dict1complexDict2의 종류에있다.

dict1[String : String] 유형으로 추정되는 반면, complexDict2[String : Any] 유형으로 추정된다. 명시 적으로 dict1에 유형 약어로 지정하면

코드는, 잘 작동 :

var dict1: [String : Any] = [ 
    "aaa":"dict1", 
    "her": "dict1" 
] 
+0

놀아야 만한다고 생각했지만 놀이터에서 시도 할 때 "치명적인 오류 : 다른 크기의 유형간에 unsafeBitCast를 사용할 수 없습니다"라는 오류가 발생했습니다. 그러나'[String : AnyObject]'는 잘 동작합니다. "Any"오류가 발생하는 이유를 알지 못했습니다. (Xcode 7.3.1) –

+0

이상합니다. 왜 처음에 이런 짓을하는지 물어봐도 될까요? – Alexander

+0

나? 나는 그 질문에 대한 대답이라고 생각하는 것을 검증하려고 노력했다. :) –

관련 문제