所以我想创建符合特定协议的实例。我想创建一个或另一个符合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))

更新
Arrayextends不支持多态性(扩展前后的数组必须是同一类型)。
extension Array {

    ...

    mutating func extend<S : SequenceType where T == T>(newElements: S)

    ...

}

最佳答案

Swift中的一个错误是,这段代码会使编译器或操场崩溃。(应提供有用的错误消息。)
正如您在更新中注意到的,它不起作用的原因是generateWithInstances返回As([A])的数组,并且extend要求ATestProtocol相同:
instances不能转换为[TestProtocol],因为TestProtocol不是A的子类型。
但是,您可以使用append一次将对象放在一个对象中:

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

您可以为不需要类型相等的Array编写扩展。

关于generics - 使用泛型存储和生成类的实例,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26411556/

10-10 10:55