[英]Swift: Can the type of an Element in an Array be discovered and used to specify the generic type argument?
[英]Array of generic type as argument to function
这是一个非常简单的问题,但令人发疯!
我有一个通用的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结合使用)
您需要提供Event类的通用类型。 以下代码正确编译:
Event<Int>.listenAny(l, events: v)
注意:我使用Int作为泛型类型,但是您可以使用任何类型。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.