Использование JSONEncoder для метода Equatable в Swift - PullRequest
0 голосов
/ 29 октября 2018

Я знаю, что ключи JSON не имеют какого-либо порядка и могут генерироваться случайным образом, но ничто не мешает мне написать эту функцию, и из моих тестов это работает для каждого моего варианта использования, который я тестировал.

func ==<T: Encodable> (lhs: T, rhs: T) -> Bool {
   let encoder = JSONEncoder()
   do {
       let leftEncoded = try encoder.encode(lhs)
       let rightEncoded = try encoder.encode(rhs)
       return leftEncoded == rightEncoded
   } catch {
       return false
   }
}

Проблема, которую я хочу решить, - это написание функции для типа, который имеет массив из одного протокола с примерно 20 различными реализациями, для чего мне нужно реализовать функцию == вместо быстрой автоматической синтеза. И я знаю, что могу переключиться на JSONSerialization.writeJSONObject с опцией .sortedKeys, чтобы сохранить порядок ключей.

В чем недостаток этой реализации вместо любого другого метода написания == функции?

1 Ответ

0 голосов
/ 29 октября 2018

Ответ, похоже, на ваш вопрос: «У ключей JSON нет порядка». Кроме того, две вещи, которые являются логически равными, могут кодироваться по-разному (например, если их равенство зависит только от их идентификатора). Кроме того, ссылочные типы, которые кодируют одни и те же значения, могут вообще не быть совместимыми (например, UIView). Кроме того, это создает очень широкую перегрузку ==, что делает проверку типов более дорогой (почти как + очень дорого).

То, что вы делаете, пытается автоматически соответствовать Equatable, когда он может быть синтезирован. Свифт мог бы сделать это; фактически, для большинства Encodable случаев Equatable можно синтезировать, просто добавив : Equatable. Команда Swift явно решила не выполнять автоматическое согласование в этих случаях и заставлять вас запрашивать его, когда вы это имеете в виду, потому что это не всегда означает «все свойства содержат одинаковые биты». Когда команда Swift явно выбирает избегать функции, редко бывает хорошей идеей добавить ее заново.

...