Search code examples
swiftgenericsinitializationswift-protocolsswift-extensions

'let' property may not be initialized directly; use "self.init(...)" or "self = ..." instead


I want to try to write a default init in a protocol extension, so I did this:

protocol P {
    var data: [AnyHashable: Any] { get }
    init(_ s: String)
}

extension P {
    init(_ s: String) {
        self.data = ["s": s]
    }
}

But I'm getting this error:

'let' property 'data' may not be initialized directly; use "self.init(...)" or "self = ..." instead

I have no idea what it means. Thanks for your help!


Solution

  • The error says that the variable cannot be initialized in the protocol extension because it's declared as constant { get }

    But even if you declare the variable { get set } you can't use the init method anyway without a constraint to a concrete type or an associated type.