Swift: Как закодировать хэш-карту с enum в качестве ключа?

У меня есть перечисление как это:

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

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

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

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

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

Ошибка говорит о том, что: "encode(with aCoder: NSCoder) *** Завершение приложения из-за необработанного исключения" NSInvalidArgumentException ", причина:" -[_SwiftValue encodeWithCoder:]: нераспознанный селектор, отправленный экземпляру 0x17045f230 "

Как я могу закодировать этот Hashmap?

Благодарю.

1 ответ

Решение

Как отмечено в комментарии 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
    }
    //...
}
Другие вопросы по тегам