2016-12-28 2 views
1

У меня есть перечисление вроде этого:Swift: как закодировать хэш-карту с перечислением в качестве ключа?

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

И у меня есть переменная результата, который является HashMap, используя эти направления перечисления в качестве ключа.

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

Я попытался закодировать этот объект и отправить его на другую сторону через фреймворк. Однако он не работает в кодере.

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

Ошибка говорит: «закодировать (с aCoder: NSCoder) *** Нагрузочного приложения из-за неперехваченное исключение 'NSInvalidArgumentException', причина:«- [_ SwiftValue encodeWithCoder]: непризнанный селектор направлена ​​например 0x17045f230 '

Как кодировать этот HashMap?

Спасибо.

+2

Обратите внимание, что это Swift конвенции использовать 'lowerCamelCase' для случаев перечислений (это не Java!). Я также предполагаю, что вы говорите «Словарь», когда говорите «Хашмап». Также '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 = [Направление: [String]]() – user6539552

ответ

3

Как было отмечено в особенности JAL комментарий NSCoding основан на Objective-C среды выполнения, так что вы необходимо преобразовать ваш словарь в то, что безопасно конвертируется в NSDictionary.

Например:

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: [Направление: [String]]] Почему я не смог написать уаг nsResult: [String: [String: [Tile]]] = [: [: [Плитка]]] – user6539552

+0

@ user6539552, пожалуйста, отредактируйте свой вопрос и покажите более конкретный пример с указанием того, как определяются 'AnotherEnumType' и' Tile'. – OOPer

+0

Спасибо, он решил мою проблему! – user6539552

Смежные вопросы