我想要一个带有类型 T 参数的泛型类 ClassA,该参数符合名为 ItemProtocol 的特定协议。我想在类中拥有一个 T 数组,但是 T 实例的初始化不起作用。应该怎么做呢?
protocol ItemProtocol: Codable {
var itemId: String { get set }
var parameter2: String { get set }
var parameter3: String { get set }
}
struct Item: ItemProtocol {
var itemId: String
var parameter2: String
var parameter3: String
}
protocol AClassProtocol {
associatedtype ItemProtocol
func createItem() -> [ItemProtocol]
}
class ClassA<T: ItemProtocol>: AClassProtocol {
private lazy var items = [T]()
private func createItem() -> [T] {
let newItem = T(itemId: "someDummyID", //Compilation error here
parameter2: "ABC",
parameter3: "BCA")
items.append(newItem)
return items
}
}
问题是
T
是 ItemProtocol
并且 ItemProtocol
没有定义任何显式初始化器。如果您将以下声明添加到 ItemProtocol
:,您的代码将编译
init(itemId: String, parameter2: String, parameter3: String)
添加后,该行:
let newItem = T(itemId: "someDummyID",
parameter2: "ABC",
parameter3: "BCA")
将按预期编译。
如果没有添加,通过
init
唯一可用的 ItemProtocol
是通过 init
获得的 Decodable
协议声明的 Codable
。 init
被声明为 init(from: Decoder)
,这是触发有关缺少 from
的错误的地方。