在不知道具体类型的情况下实例化集合

时间:2019-06-18 17:11:28

标签: swift generics collections

我有一个类,该类在符合Collection协议的T类型上是通用的。现在,我想在不知道集合具体类型的情况下实例化集合,这可能吗?

class FileStore<T: Collection>{

   var collection: T

   init(){
      collection = T() // This will never work
   }

}

1 个答案:

答案 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,例如DictionarySet等)。

class OtherFileStore<T: RangeReplaceableCollection> {
    var collection = T.init()
}