2016-01-04 3 views
0

Я борюсь за создание массива дженериков в Swift. Вот мои протоколы/классы.Swift - Объявление массива генериков

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>]() 

Я получаю следующее сообщение об ошибке:

Using InitializableWithData as a concrete type conforming to protocol 'InitializableWithData' is not supported.

Я не заинтересован в фактическом типе "содержал" по RequestWithCompletionHandler. Я просто хочу отслеживать все запросы, не заботясь о том, какой объект они «возвратят». Я хочу отслеживать их, поэтому я могу отменить их, приостановить их и т. Д.

Поэтому я хочу отслеживать все текущие запросы, чтобы я мог выполнить их при необходимости.

ответ

0

В сообщении об ошибке указано, что тип протокола (InitializableWithData) нельзя использовать в качестве конкретного типа (в RequestWithCompletionHandler<InitializableWithData>).

Вам нужен конкретный тип, соответствующий протоколу, как структуры, например

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>]() 
+0

Но это не то, что мне нужно. Меня не интересует фактический тип, содержащийся в RequestWithCompletionHandler. Я просто хочу отслеживать все запросы, не заботясь о том, какой объект они «возвратят». Я хочу отслеживать их, чтобы отменить их, приостановить их и т. Д. – Cosmin

Смежные вопросы