Generics 使用泛型存储和生成类的实例

Generics 使用泛型存储和生成类的实例,generics,swift,Generics,Swift,所以我想创建符合特定协议的实例。我想创建一个或另一个符合TestProtocol的类的实例。我不能在操场上运行这个代码,所以我想知道出了什么问题?或者更好的是,这应该如何解决 protocol TestProtocol { init(value: Int) } class A : TestProtocol { init() {} required init(value: Int) { } } func generateWithInstances<T

所以我想创建符合特定协议的实例。我想创建一个或另一个符合TestProtocol的类的实例。我不能在操场上运行这个代码,所以我想知道出了什么问题?或者更好的是,这应该如何解决

protocol TestProtocol {
    init(value: Int)
}

class A : TestProtocol {

    init() {}
    required init(value: Int) {

    }
}

func generateWithInstances<T : TestProtocol>(item: T, #numberOfInstances: Int) -> [T] {
    var list: [T] = []
    for index in 1...numberOfInstances {
        list.append(T(value: index))
    }
    return list
}

var list: [TestProtocol] = []
let instanceOfA = A()

list.extend(generateWithInstances(instanceOfA, numberOfInstances: 10))

这是Swift中的一个错误,该代码会使编译器或操场崩溃。(应提供有用的错误消息。)

正如您在更新中所指出的,它不起作用的原因是
generateWithInstances
返回一个
A
s(
[A]
)数组,而
extend
要求
A
TestProtocol
相同:

实例
不能强制转换为
[TestProtocol]
,因为
TestProtocol
不是
a
的子类型

但是,您可以使用
append
,一次将对象放入一个:

for obj in instances {
    list.append(obj)
}
您可以为
数组
编写不需要类型相等的扩展

for obj in instances {
    list.append(obj)
}