2016-12-28 2 views
1

는이 같은 열거 있습니다Swift : enum을 키로 사용하여 해시 맵을 인코딩하는 방법은 무엇입니까?

enum Direction : String { 
     case EAST = "east" 
     case SOUTH = "south" 
     case WEST = "west" 
     case NORTH = "north" 
    } 

을 그리고 키 등이 열거 방향을 사용하여 해시 MAP 인 변수라는 결과가 있습니다.

var result = [Direction:[String]]() 

이 개체를 인코딩하여 멀티 페어 프레임 워크를 통해 다른 쪽에서 보내려고했습니다. 그러나 인코더에서는 오류가 발생합니다. 때문에 캐치되지 않는 예외 'NSInvalidArgumentException'응용 프로그램 종료, 이유는 *** : "인코딩 (NSCoder aCoder으로 :) :

aCoder.encode(self.result, forKey: "result") 

오류는 말한다 '- [_ SwiftValue encodeWithCoder이 :] : 인식 할 수없는 선택 예를 0x17045f230로 전송 '

어떻게이 해시 맵을 인코딩 할 수 있습니까?

감사합니다.

목표 - C 런타임을 기반으로 JAL의 의견 NSCoding 기능에서 언급 한 바와 같이
+2

주 (이것은 자바되지는!). 또한 해시 맵 (Hashmap)을 말할 때'Dictionary'를 참조한다고 가정합니다. 또한'var result = [Direction : [String]]'이 유효하지 않습니다. Swift,'var result = [Direction : [String]]()'또는'var result : [Direction : [String]]'을 의미 했습니까? – Hamish

+0

다음은 중복 기사입니다. http://stackoverflow.com/questions/24562357/how-can-i-use-a-swift-enum-as-a-dictionary-key-conforming-to-equatable – mrabins

+0

예, 저는 var result = [Direction : [String]]() – user6539552

답변

3

, 당신 때문에 사전을 NSDictionary으로 안전하게 변환 할 수있는 것으로 변환해야합니다. 예를 들어

: 그것은`사용 열거 경우에 lowerCamelCase`하는 스위프트 규칙 있다는

func encode(with aCoder: NSCoder) { 
    var nsResult: [String: [String]] = [:] 
    for (key, value) in result { 
     nsResult[key.rawValue] = value 
    } 
    aCoder.encode(nsResult, forKey: "result") 
    //... 
} 
required init?(coder aDecoder: NSCoder) { 
    let nsResult = aDecoder.decodeObject(forKey: "result") as! [String: [String]] 
    self.result = [:] 
    for (nsKey, value) in nsResult { 
     self.result[Direction(rawValue: nsKey)!] = value 
    } 
    //... 
} 
+0

무엇 [AnotherEnumType : [방향이 : [문자열]]] 내가 실패한 이유를 이 var에 nsResult를 작성하려면 : [문자열 : [문자열 : [타일]]] = [[: [타일]]] – user6539552

+0

@ user6539552, 귀하의 질문을 편집하고'AnotherEnumType'과'Tile' 정의 방법을 지정하는 구체적인 예를 보여주십시오. – OOPer

+0

고마워, 내 문제가 해결 됐어! – user6539552