我想尝试在init
扩展名中写入默认的protocol
,所以我这样做了:
protocol P {
var data: [AnyHashable: Any] { get }
init(_ s: String)
}
extension P {
init(_ s: String) {
self.data = ["s": s]
}
}
但是我遇到了这个错误:
'let'属性'data'可能无法直接初始化;使用“ self.init(...)”或“ self = ...”代替
我不知道这意味着什么。感谢您的帮助!
答案 0 :(得分:5)
该错误表明该变量无法在协议扩展中初始化,因为该变量已声明为常量{ get }
但是,即使声明了变量{ get set }
,也不能在没有具体类型或关联类型约束的情况下使用init
方法。
答案 1 :(得分:0)
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
由其他类共享。