Это очень простая проблема для объяснения, но это сводит меня с ума!Массив общего типа в качестве аргумента функции
У меня есть общий Event
класс:
class Event<T> {
// Etc...
}
В этом классе я хочу, чтобы добавить функцию класса, который принимает массив Event
с и возвращает другой общий тип (EventListener
):
public class func listenAny<V>(listener: AnyObject, events: [Event<V>]) -> EventListener<V> {
// Etc...
}
По какой-то причине этот код не компилируется!
let e1 = Event<Int>()
let e2 = Event<Int>()
class Listener {}
let l = Listener()
Event.listenAny(l, events: [e1, e2])
Компилятор выдает ошибку на последней строке:
Вот кусок кода, который можно вставить на детской площадке (я испытал это на детской площадке на Xcode 6.1.1) и испытайте разочарование для себя:
public class Event<T> {
private var eventListeners = [EventListener<T>]()
public class func listenAny<V>(listener: AnyObject, events: [Event<V>]) -> EventListener<V> {
let eventListener = EventListener<V>(listener: listener)
for event in events { event.addListener(eventListener) }
return eventListener
}
private func addListener(listener: EventListener<T>) -> EventListener<T> {
eventListeners.append(listener)
return listener
}
}
public class EventListener<T> {
weak public var listener: AnyObject?
private init(listener: AnyObject) {
self.listener = listener
}
}
let e1 = Event<Int>()
let e2 = Event<Int>()
class Listener {}
let l = Listener()
let v = [e1, e2]
Event.listenAny(l, events: v)
Почему это не работает?
PS: Я предполагаю, что массив событий будет переменным параметром. Я надеюсь, что если я получу это для работы с массивом, я могу сделать то же самое с переменным параметром.
PSS: Кажется, что если я делаю listenAny
глобальной функцией, она работает. Это может быть проблемой для системы типов (T от события в сочетании с V из функции ...)
Мне кажется, что параметр типа '' в 'listenAny' на самом деле не нужен. Почему бы вам не отказаться от этого (и заменить 'V' на' T' в методе)? –