Quiero intentar escribir un init predeterminado en una extensión de protocol , así que hice esto:
protocol P { var data: [AnyHashable: Any] { get } init(_ s: String) } extension P { init(_ s: String) { self.data = ["s": s] } }Pero estoy recibiendo este error:
La propiedad 'let' 'data' no se puede inicializar directamente; use "self.init(...)" o "self = ..." en su lugar
No tengo idea de lo que significa. ¡Gracias por tu ayuda!
El error dice que la variable no se puede inicializar en la extensión del protocolo porque está declarada como constante { get }
Pero incluso si declara la variable { get set } , no puede usar el método init de todos modos sin una restricción a un tipo concreto o un tipo asociado.
import PlaygroundSupport protocol P { var data: [AnyHashable: Any] { get } var _data: [AnyHashable: Any] { get set } static func generator(_ s: String) -> P init() } extension P { static func generator(_ s: String) -> P { var p = self.init() p._data = ["s": s] return p } } class A: P { required init() { } var data: [AnyHashable : Any] { return _data } var _data: [AnyHashable : Any] = [:] } let a = A.generator("some") print(a.data) PlaygroundPage.current.finishExecution() Creo que este es el código más cercano que desea. El problema es que _data es compartido por otras clases.