Node.js 如何在Swift中优雅地实现EventEmitter

Node.js 如何在Swift中优雅地实现EventEmitter,node.js,swift,Node.js,Swift,我正在编写一个绑定到Swift的hiredis,并正在处理异步API部分 我想在Node.js中使用类似于EventEmitter的东西 objectToBeListened.on('event',(data)=>{…}) objectToBeListened.emit('事件') 也就是说,我希望我拥有的每个类只有一个“on”和一个“emit”函数 我目前对所有事件类型使用enum,并在“开启”功能中使用switch。引入了一个额外的struct,用于存储所有回调函数 我无法实现通用的“e

我正在编写一个绑定到Swift的
hiredis
,并正在处理异步API部分

我想在Node.js中使用类似于EventEmitter的东西


objectToBeListened.on('event',(data)=>{…})
objectToBeListened.emit('事件')

也就是说,我希望我拥有的每个类只有一个“on”和一个“emit”函数

我目前对所有事件类型使用
enum
,并在“开启”功能中使用
switch
。引入了一个额外的
struct
,用于存储所有回调函数

我无法实现通用的“emit”函数:我只是浏览了一下Swift的泛型部分。但这有可能吗?Swift似乎没有可变模板

无论如何,我的原型代码非常难看,很难维护。有没有更好的方法来优雅地实现EventEmitter

class EEProto {
    var A: Int
    var B: Double

    typealias EventChangeA = (Int, Int) -> Void
    typealias EventChangeB = (Double, Double) -> Void
    typealias EventChanged = () -> Void

    struct RegisteredEvent {
        var eventChangeA: EventChangeA[]
        var eventChangeB: EventChangeB[]
        var eventChanged: EventChanged[]
    }

    enum EventType {
        case changeA(EventChangeA[])
        case changeB(EventChangeB[])
        case changed(EventChanged[])
    }

    var registeredEvents: RegisteredEvent

    init (A: Int, B: Double) {
        self.A = A
        self.B = B
        registeredEvents = RegisteredEvent(eventChangeA: [], eventChangeB: [], eventChanged: [])
    }

    func on (event: EventType) {
        switch event {
        case .changeA(let events):
            registeredEvents.eventChangeA += events
        case .changeB(let events):
            registeredEvents.eventChangeB += events
        case .changed(let events):
            registeredEvents.eventChanged += events
        default:
            assert("unhandled event type | check your code")
            break
        }
    }

    func resetEvents (eventType: EventType) {
        switch eventType {
        case .changeA:
            registeredEvents.eventChangeA = []
        case .changeB:
            registeredEvents.eventChangeA = []
        case .changed:
            registeredEvents.eventChangeA = []
        default:
            assert("unhandled event type | check your code")
            break
        }
    }

    func setA (newA: Int) {
        let oldA = A
        A = newA
        for cb in registeredEvents.eventChangeA {
            cb(oldA, newA)
        }
        for cb in registeredEvents.eventChanged {
            cb()
        }
    }

    func setB (newB: Double) {
        let oldB = B
        B = newB
        for cb in registeredEvents.eventChangeB {
            cb(oldB, newB)
        }
        for cb in registeredEvents.eventChanged {
            cb()
        }
    }
}

var inst = EEProto(A: 10, B: 5.5)
inst.on(EEProto.EventType.changeA([{
    println("from \($0) to \($1)")
    }]))
inst.on(EEProto.EventType.changeB([{
    println("from \($0) to \($1)")
    }]))
inst.on(EEProto.EventType.changed([{
    println("value changed")
    }]))

inst.setA(10)
inst.setB(3.14)