2015-02-20 6 views
0

Это очень простая проблема для объяснения, но это сводит меня с ума!Массив общего типа в качестве аргумента функции

У меня есть общий 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]) 

Компилятор выдает ошибку на последней строке:

error

Вот кусок кода, который можно вставить на детской площадке (я испытал это на детской площадке на 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 из функции ...)

+0

Мне кажется, что параметр типа '' в 'listenAny' на самом деле не нужен. Почему бы вам не отказаться от этого (и заменить 'V' на' T' в методе)? –

ответ

1

Вам необходимо предоставить общий тип класса Event. Следующий код компилируется правильно:

Event<Int>.listenAny(l, events: v) 

Примечание: Я использую Int как общий тип, но вы можете использовать любой тип.

+0

Хороший улов, вот и все! – Alex

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