泛型数组作为函数的参数

Array of generic type as argument to function

这是一个解释起来非常简单的问题,但它让我抓狂!

我有一个通用的 Event class:

class Event<T> {
    // Etc...
}

关于 class 我想添加一个 class 函数,该函数采用 Event 数组和 returns 另一个泛型类型 (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])

编译器在最后一行抛出错误:

这是一段代码,您可以将其粘贴到 Playground 上(我在 Xcode 6.1.1 上的 Playground 上对此进行了测试)并亲自体验一下挫败感:

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 设为全局函数,它就可以工作了。这可能是类型系统的问题(来自 Event 的 T 与来自函数的 V...)

您需要提供 class 事件的通用类型。以下代码编译正确:

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

注意:我使用 Int 作为泛型类型,但您可以使用任何类型。