Enum с необработанным значением, кодируемый - PullRequest
0 голосов
/ 06 июня 2018

Следующий код не компилируется:

enum Occupation: String {
  case designer = "Designer"
  case engineer = "Engineer"
}

public struct SteveJobs: Codable {
  let name: String
  let occupation: Occupation
}

С другой стороны, он должен компилироваться, поскольку Occupation представляется как String, что Codable.

Почему я не могу использовать enum с необработанным значением в Codable структурах?

В частности, почему автоматическое соответствие не работает в таком случае.

error

1 Ответ

0 голосов
/ 06 июня 2018

Автоматический Codable синтез - «opt-in», т. Е. Вы должны явно объявить о соответствии:

enum Occupation: String, Codable { // <--- HERE
    case designer = "Designer"
    case engineer = "Engineer"
}

public struct SteveJobs: Codable {
    let name: String
    let occupation: Occupation
}

См. SE-0166 Swift Архивация и сериализация

Принимая эти протоколы, пользовательские типы выбирают эту систему.

То же самое верно для автоматического Hashable и Equatable синтеза, сравните Запрос на синтезopt-in в SE-0185, где перечислены некоторые причины:

  • Синтаксис для выбора является естественным;Сегодня в Swift нет четкого аналога, позволяющего отказаться от использования функции.

  • Пользователям необходимо сознательно принять решение об общедоступном API, отображаемом их типами.Типы не могут случайно «попасть» в соответствия, которые пользователь не желает;тип, который изначально не поддерживает Equatable, может быть выполнен позднее, но обратное изменение является критическим.

  • Соответствия, поддерживаемые типом, можно четко увидеть, изучив егоисходный код;ничего не скрыто от пользователя.

  • Мы сокращаем объем работы, выполняемой компилятором, и объем кода, генерируемого за счет того, что не синтезируются несоответствия, которые не нужны и не используются.

...