'let' 属性 可以不直接初始化;使用 "self.init(...)" 或 "self = ..." 代替

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

我想尝试在 protocol 扩展中写一个默认的 init,所以我这样做了:

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

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

但是我收到这个错误:

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

我不知道这是什么意思。感谢您的帮助!

错误说变量不能在协议扩展中初始化,因为它被声明为常量{ get }

但是,即使您声明了变量 { get set },如果没有具体类型或关联类型的约束,您也无法使用 init 方法。

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()

我认为这是您想要的最接近的代码。问题是 _data 被其他 类.

共享