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

时间:2014-10-16 18:37:17

标签: generics swift

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

    ...

}

1 个答案:

答案 0 :(得分:1)

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

正如您在更新中所述,其不起作用的原因是generateWithInstances返回A s([A])数组,extend要求ATestProtocol相同:

  

'TestProtocol' is not identical to 'A'

instances无法投放到[TestProtocol],因为TestProtocol不是A的子类型。

但是,您可以使用append

一次将对象放在一个对象中
for obj in instances {
    list.append(obj)
}

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