这是一个非常简单的问题需要解释,但它让我疯了!
我有一个通用的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])
编译器在最后一行抛出错误:
这是一段你可以粘贴在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一起......)
答案 0 :(得分:1)
您需要提供类Event的泛型类型。以下代码正确编译:
Event<Int>.listenAny(l, events: v)
注意:我使用Int作为泛型类型,但您可以使用任何类型。