Ссылка на класс кодируемых протоколов не кодируется - PullRequest
0 голосов
/ 31 марта 2019

Если член моего класса 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()
    }
 }

1 Ответ

0 голосов
/ 17 июля 2019

Вот как это исправить.

class AnotherClass<T: MyProtocol> : Codable {
    let y = 5
    let mp : T
    init() {
        mp = MyClass() as! T // handle this more gracefully
    }
}

И используйте это так

let a = AnotherClass<MyClass>()

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

...