Если член моего класса AnotherClass относится к типу с кодируемым абстрактным протоколом, компилятор не может синтезировать код кодирования / декодирования для класса. Если вместо этого один и тот же член является конкретным классом, соответствующим тому же протоколу, то компилятор с удовольствием синтезирует код кодирования / декодирования. Я думаю, что второй случай должен работать, свойство mp всегда будет конкретным экземпляром Codable MyProtocol, который является Codable.
/* This works */
protocol MyProtocol : Codable {
func a(_ n : Int) -> Int
}
class MyClass : MyProtocol {
let x = 3
func a( _ n : Int ) -> Int {
return n * x
}
}
class AnotherClass : Codable {
let y = 5
let mp : MyClass // <---- ACTUAL CLASS
init() {
mp = MyClass()
}
}
/* But this won't work.
Compiler error:
Type 'AnotherClass' does not conform to protocol 'Decodable'
Type 'AnotherClass' does not conform to protocol 'Encodable'
*/
protocol MyProtocol : Codable {
func a(_ n : Int) -> Int
}
class MyClass : MyProtocol {
let x = 3
func a( _ n : Int ) -> Int {
return n * x
}
}
class AnotherClass : Codable {
let y = 5
let mp : MyProtocol // <-------- PROTOCOL
init() {
mp = MyClass()
}
}