我有一个类,它在符合 Collection 协议(protocol)的类型 T 上是通用的。现在我想在不知道集合的具体类型的情况下实例化集合,这可能吗?
class FileStore<T: Collection>{
var collection: T
init(){
collection = T() // This will never work
}
}
最佳答案
Collection
在其协议(protocol)要求中没有 init
,因此您不能直接初始化 Collection
实例。虽然你有几个解决方案。您可以将泛型类型约束限制为保证具有 init 的类型(例如 Array
),或者您可以创建自己的需要 init
的协议(protocol),使 T
要求符合该协议(protocol)并扩展您希望能够存储的所有 Collection
以符合您的协议(protocol)。
第二种方法如下所示:
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
并且初始化为空,例如 Dictionary
、设置
等)。
class OtherFileStore<T: RangeReplaceableCollection> {
var collection = T.init()
}
关于swift - 在不知 Prop 体类型的情况下实例化集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56654031/