我有一个类,该类在符合Collection协议的T类型上是通用的。现在,我想在不知道集合具体类型的情况下实例化集合,这可能吗?
class FileStore<T: Collection>{
var collection: T
init(){
collection = T() // This will never work
}
}
答案 0 :(得分:2)
Collection
在其协议要求中没有init
,因此您不能直接初始化Collection
实例。您有几种解决方案。您可以将通用类型约束限制为保证具有初始化的类型(例如Array
),也可以创建自己的协议,要求init
,使T
要求符合该约束协议并扩展您要能够存储的所有Collection
来符合您的协议。
第二种方法如下所示:
protocol Initializable {
init()
}
class FileStore<T: Collection> where T: Initializable {
var collection: T
init(){
collection = T.init()
}
}
// Extend the `Collection` conformant types
extension Array: Initializable {}
extension Dictionary: Initializable {}
extension Set: Initializable {}
// Create a FileStore
FileStore<Array<Int>>()
FileStore<[String:Int]>()
FileStore<Set<String>>()
或者根据您希望存储的确切类型,使用内置RangeReplaceableCollection
作为类型约束会更好。 (请记住,相当多的标准库类型不符合RangeReplaceableCollection
,但确实符合Collection
并且具有空的init,例如Dictionary
,Set
等)。
class OtherFileStore<T: RangeReplaceableCollection> {
var collection = T.init()
}