swift - 在不知 Prop 体类型的情况下实例化集合

标签 swift generics collections

我有一个类,它在符合 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/

相关文章:

swift - UI 未加载,代码仍在运行

C#:泛型中没有强制转换?

C#:数字的通用接口(interface)

java - Java 中带有 HashMap 的摩尔斯电码翻译器

c++ - boost::multi_index_container 是否连续存储在内存中?

hibernate - Hibernate HQL和Grails-如何比较集合?

ios - kCFCompareEqualTo 在 swift 中不可用吗?

ios - 如何从 SKView 过渡到 SCNView?

iOS BLE "Characteristic User Description"

string - 如何在类似列表的模式匹配中使用 scala 字符串