首页 > 解决方案 > 在不知道具体类型的情况下实例化集合

问题描述

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

class FileStore<T: Collection>{

   var collection: T

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

}

标签: swiftgenericscollections

解决方案


Collection它没有init协议要求,因此您不能直接初始化Collection实例。你有几个解决方案。您可以将泛型类型约束限制为确实保证具有 init 的类型(例如Array),或者您可以创建自己的协议 requires init,使Trequire 符合该协议并扩展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()
}

推荐阅读