Swift:在泛型类中实例化类型<T>实例

问题描述 投票:0回答:1

我想要一个带有类型 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
    }
}

我收到的编译错误是:

swift oop generics protocols
1个回答
0
投票

问题是

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
的错误的地方。

© www.soinside.com 2019 - 2024. All rights reserved.