Вложенные кодируемые протоколы с Swift 4

Я немного поиграл со Swift 4 и Codable и застрял в каком-то сценарии с вложенными протоколами, которые все соответствуют Codable.

Упрощенный пример выглядит так:

protocol CodableSomething: Codable {}

protocol CodableAnotherThing: Codable {
    var something: CodableSomething { get }
}

struct Model: CodableAnotherThing {
    var something: CodableSomething
}

Этот код вызывает ошибки сборки с Xcode 9 Beta 5:

  • Тип «Модель» не соответствует протоколу «Декодируемый»
  • Тип «Модель» не соответствует протоколу «Кодируемый»

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

Мой вопрос: это ошибка компилятора (это все еще бета-версия) или я делаю что-то не так?


person tadija    schedule 16.08.2017    source источник
comment
Сравните stackoverflow.com/q/44441223/2976878   -  person Hamish    schedule 17.08.2017


Ответы (1)


Если вы переключаете протокол

CodableSomething

Для структуры у вас не было бы ошибок,

пойдите дальше и узнайте больше о Codable

с какими типами может работать Codable и почему? там вы в основном говорите это xCode

struct foo: Codable {
    var ok: Codable
}

Это неправильно, внимательно посмотрите на это, Codable - это Typealias, которому вы должны соответствовать, чтобы использовать его подпрограммы, такие как .Decode(), .Encode(), эти методы работают со значениями, а не с типами абстракции, поэтому предоставление типа Codable для переменной это не будет работать из. потому что Codable - это typealias, который указывает Decodable и Encodable

/// A type that can convert itself into and out of an external representation.
public typealias Codable = Decodable & Encodable

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

таким образом, Codable является абстракцией, она не может декодировать или кодировать переменные своего собственного типа, но может кодировать и декодировать типы, которые ему подтверждены.

person Mohmmad S    schedule 16.09.2018
comment
Другими словами, Codable не является типом, который можно кодировать и декодировать, в отличие от типов данных (String, Int, Bool и т. д.). - person Mohmmad S; 16.09.2018