'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
被其他 类.
共享
我想尝试在 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
被其他 类.