所以我想创建符合特定协议(protocol)的实例。我想创建 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 不支持多态(extends前后的数组必须是同一类型)
extension Array {
...
mutating func extend<S : SequenceType where T == T>(newElements: S)
...
}
最佳答案
这段代码会导致编译器或 playground 崩溃,这是 Swift 中的一个错误。 (应提供有用的错误消息。)
正如您在更新中指出的那样,它不起作用的原因是 generateWithInstances
返回 A
的数组s ( [A]
), 和 extend
要求 A
与 TestProtocol
相同:
instances
无法转换为 [TestProtocol]
自 TestProtocol
不是 A
的子类型.
但是,您可以使用 append
将对象一次放入一个中:
for obj in instances {
list.append(obj)
}
你可以为 Array
写一个扩展这不需要类型相等。
关于generics - 使用泛型存储和生成类的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26411556/