swift - 在不知道具体类型的情况下实例化集合
问题描述
我有一个类是通用的类型 T 符合 Collection 协议。现在我想在不知道集合的具体类型的情况下实例化集合,这可能吗?
class FileStore<T: Collection>{
var collection: T
init(){
collection = T() // This will never work
}
}
解决方案
Collection
它没有init
协议要求,因此您不能直接初始化Collection
实例。你有几个解决方案。您可以将泛型类型约束限制为确实保证具有 init 的类型(例如Array
),或者您可以创建自己的协议 requires init
,使T
require 符合该协议并扩展Collection
您希望能够存储的所有 s 以符合到您的协议。
第二种方法如下所示:
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
,Set
等)。
class OtherFileStore<T: RangeReplaceableCollection> {
var collection = T.init()
}
推荐阅读
- django - 使用自定义查找扩展 Django 中的 _range 查找
- r - 为什么 surv_pvalue(或任何其他)函数在 R 中的自定义函数中不起作用?
- javascript - 谁能告诉我为什么这个函数在调用时会抛出错误
- r - 如何使用具有多个参数的 mapply 复制函数来计算方法的功效?
- image - 如何将图像 URL 链接到另一个 URL 以在颤动中显示有关第一个 URL 的一些信息?
- python - Python有没有让用户输入列表的快速方法?
- google-cloud-platform - GCP Cloud SQL 是区域资源还是区域资源?
- ruby - 你如何从ruby中的另一个类调用一个类变量
- github-pages - Github Pages:无限重定向,只有 2 条记录
- rust - 如何在源文件中将字符“E”表示为单个字节?