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

时间:2015-02-20 21:11:15

标签: arrays swift generics

这是一个非常简单的问题需要解释,但它让我疯了!

我有一个通用的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

这是一段你可以粘贴在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一起......)

1 个答案:

答案 0 :(得分:1)

您需要提供类Event的泛型类型。以下代码正确编译:

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

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