Как сделать словарь, содержащий кортеж, соответствующим кодируемым? - PullRequest
1 голос
/ 20 мая 2019

Я уже видел здесь много других похожих вопросов, но я не смог найти свой случай - извинения, если я пропустил что-то очевидное!

У меня есть 'Класс транзакции, который содержит некоторые свойства, все из которых соответствуют кодируемым и прекрасно сохраняются / загружаются.Я только что добавил словарь и получил следующую ошибку: Тип «Транзакция» не соответствует протоколу «Декодируемый» и «Кодируемый».

Словарь:

var splitTransaction: [String:(amount: Money<GBP>, setByUser: Bool)]? {

гдеДеньги отсюда: https://github.com/Flight-School/Money (Деньги уже соответствуют кодируемым, и у меня есть другие свойства типа Деньги, которые работают хорошо.

С https://developer.apple.com/documentation/foundation/archives_and_serialization/encoding_and_decoding_custom_types Я думаю, что должен использоватьКлючи кодирования для кодирования / декодирования splitTransaction, но означает ли это, что я должен иметь ключ кодирования для каждого из моих других свойств? И затем предоставить способ кодировать / декодировать их тоже? Или есть способ оставить все остальные свойствакодирование / декодирование автоматически, и просто предоставьте способ для splitTransaction работать вручную.

Любое руководство высоко ценится!

1 Ответ

1 голос
/ 20 мая 2019

Проблема в том, что значения в Dictionary равны Tuple с, а кортежи не соответствуют Codable. К сожалению, вы даже не можете расширить Tuple, так как это неноминальные типы, поэтому вам придется либо переключиться на другой тип данных, либо реализовать методы кодирования и декодирования самостоятельно.

Я бы предложил использовать пользовательский struct вместо кортежа, что-то вроде

struct TransactionAmount<Currency>: Codable {
    let amount: Money<Currency>
    let setByUser: Bool
}

А потом в вашем Transaction классе,

var splitTransaction: [String:TransactionAmount<GBP>]? {...
...