简体   繁体   English

Swift-声明泛型数组

[英]Swift - Declaring an array of generics

I am struggling creating an array of generics in Swift. 我正在努力在Swift中创建泛型数组。 Here are my protocols / classes. 这是我的协议/类。

public protocol InitializableWithData {
    init(data: NSData?) throws 
}

internal struct RequestWithCompletionHandler<T: InitializableWithData> {
    let request: APIRequest<T>
    let completionHandler: ((response: APIResponse<T>?, error: Error?) -> Void)?
}

var ongoingRequests = [RequestWithCompletionHandler<InitializableWithData>]()

I get the following error: 我收到以下错误:

Using InitializableWithData as a concrete type conforming to protocol 'InitializableWithData' is not supported. 不支持将InitializableWithData用作符合协议“ InitializableWithData”的具体类型。

I am not interested in the actual type "contained" by RequestWithCompletionHandler . 我对RequestWithCompletionHandler的实际类型“包含”不感兴趣。 I just want to keep track of all requests, without caring what entity they will "return". 我只想跟踪所有请求,而不关心它们将“返回”哪个实体。 I want to keep track of them so I can cancel them, pause them, etc. 我想跟踪它们,以便取消它们,暂停它们,等等。

So I want to keep track of all the ongoing requests so I can re execute them if necessary. 因此,我想跟踪所有正在进行的请求,以便在必要时可以重新执行它们。

The error message says you cannot use a protocol type ( InitializableWithData ) as concrete type (in RequestWithCompletionHandler<InitializableWithData> ). 错误消息指出您不能使用协议类型( InitializableWithData )作为具体类型(在RequestWithCompletionHandler<InitializableWithData> )。

You need a concrete type conforming to the protocol like a struct for example 您需要一个符合协议的具体类型,例如struct

public protocol InitializableWithData {
  init(data: NSData?) throws
}

internal struct RequestWithCompletionHandler<T: InitializableWithData> {
  let request: APIRequest<T>
  let completionHandler: ((response: APIResponse<T>?, error: Error?) -> Void)?
}

struct Test : InitializableWithData {
  let data : NSData?

  init(data: NSData?) throws {
    self.data = data
  }
}

var ongoingRequests = [RequestWithCompletionHandler<Test>]()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM