【问题标题】:How to save generic object to an array in swift如何快速将通用对象保存到数组中
【发布时间】:2018-05-21 07:07:58
【问题描述】:

我在上课

class SomeClass<T>: AsyncOperation, NetworkOperationProtocol {

    /// The resource model object that conforms to Parsable Response
    public typealias Resource = T
}

我想将此类的实例保存到一个数组中,并希望稍后检索它。 我怎样才能做到这一点?

【问题讨论】:

  • 您想要一个泛型类型的数组?像[SomeClass&lt;A&gt;(), SomeClass&lt;B&gt;()] 这样的东西?如果是这样,那是不可能的。

标签: arrays swift generics


【解决方案1】:

如果您的类实现了关联类型的协议,则不可能将其放入数组中,因为此类协议具有自我要求 - 他们需要知道关联类型的具体类型。

但是,您可以使用称为类型擦除的技术来存储类型,而无需关联类型信息。因此,例如,您可以创建一个没有关联类型的协议,就像这样

protocol Operation {
   func perform()
}

class SomeClass<T> : AsyncOperation, NetworkOperationProtocol, Operation

然后定义一个这样的操作数组:

let operations : [Operation] = []
operations.append(SomeClass.init())

【讨论】:

    【解决方案2】:

    如果您的泛型类型是:

    struct GenericType {}
    

    您可以使用以下方式指定泛型类:

    let array = [SomeClass<GenericType>]()
    

    或者你可以让它自己推断类型:

    class SomeClass<T>: AsyncOperation, NetworkOperationProtocol {
    
        /// The resource model object that conforms to Parsable Response
        public typealias Resource = T
        let resource: Resource
    
        init(with resource: Resource) {
            self.resource = resource
        }
    }
    
    let item = SomeClass(with: GenericType())
    let array = [item]
    

    【讨论】:

      【解决方案3】:

      应该很简单 你可以像这样声明一个数组

      var anArray = [SomeClass<Parsable>]()
      

      请注意,在声明数组时,我定义了 Parsable 而不是 T。

      如果您在创建数组时不知道 T 的类型。您可以按照以下方式进行

      var anArray = [AnyObject]()
      
      let anObject = SomeClass<Parsable>()
      anArray.append(anObject)
      
      if anArray[0] is SomeClass<Parsable> {
          print(true)
      }
      

      【讨论】:

      • 这里可以解析什么?检索时我不知道 T 的类型。
      • 在您的问题中,我在评论 Parsable 中看到。它只是一个例子。你需要知道 T 的类型,而 retrieving.use if..is 为此。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-29
      • 2020-11-27
      相关资源
      最近更新 更多