繁体   English   中英

泛型类型数组作为函数的参数

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM