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

标签 generics swift

所以我想创建符合特定协议(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 extends 不支持多态(extends前后的数组必须是同一类型)

extension Array {    

    ...

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

    ...

}

最佳答案

这段代码会导致编译器或 playground 崩溃,这是 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 写一个扩展这不需要类型相等。

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

相关文章:

java - 带有自定义 Java Generic 的 newInstance()?

Swift:类型参数的继承

java - 如何确保类型参数不可变

swift - Xcode 9.3 (Swift 4.1) 中的 Codable 'has no initializers'

swift - 如何编写没有可变计数器的 Swift 3 循环

c# - 类属性的 Lambda 表达式

c++ - 我可以在同一个 Xcode 项目中拥有 Swift、Objective-C、C 和 C++ 文件吗?

swift - 检查Swift中的枚举是否属于常量集

swift 2 : accessing the most newly spawned sprite position

java - 返回集合<?扩展类型> 与集合<类型>