所以我想创建符合特定协议的实例。我想创建A的实例或符合TestProtocol的另一个类。我无法在Playground中运行此代码,所以我想知道什么是错的?或者甚至更好,这应该如何解决?
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))
更新
Array
extend
s不支持多态(扩展前后的数组必须属于同一类型)。
extension Array {
...
mutating func extend<S : SequenceType where T == T>(newElements: S)
...
}
答案 0 :(得分:1)
Swift中的一个错误是此代码崩溃了编译器或操场。 (应提供有用的错误消息。)
正如您在更新中所述,其不起作用的原因是generateWithInstances
返回A
s([A]
)数组,extend
要求A
与TestProtocol
相同:
instances
无法投放到[TestProtocol]
,因为TestProtocol
不是A
的子类型。
但是,您可以使用append
:
for obj in instances {
list.append(obj)
}
您可以为Array
编写一个不需要类型相等的扩展名。