V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
iOS 开发实用技术导航
NSHipster 中文版
http://nshipster.cn/
cocos2d 开源 2D 游戏引擎
http://www.cocos2d-iphone.org/
CocoaPods
http://cocoapods.org/
Google Analytics for Mobile 统计解决方案
http://code.google.com/mobile/analytics/
WWDC
https://developer.apple.com/wwdc/
Design Guides and Resources
https://developer.apple.com/design/
Transcripts of WWDC sessions
http://asciiwwdc.com
Cocoa with Love
http://cocoawithlove.com/
Cocoa Dev Central
http://cocoadevcentral.com/
NSHipster
http://nshipster.com/
Style Guides
Google Objective-C Style Guide
NYTimes Objective-C Style Guide
Useful Tools and Services
Charles Web Debugging Proxy
Smore
notcome
V2EX  ›  iDev

给 Swift 写 Event Emitter,有什么优雅的方法吗?

  •  
  •   notcome · 2014-07-02 07:38:19 +08:00 via iPhone · 3570 次点击
    这是一个创建于 3798 天前的主题,其中的信息可能已经有所发展或是发生改变。
    尝试把 Swift 打造成服务端语言,昨天已经搞完了 Hiredis 同步 API 的绑定,该出手处理异步 API 了。

    如题,感觉注册事件还比较容易,用枚举可以很好的完成抽象,但是 on 函数就要手动编写了。如果使用数组存 listener 的话,还可以 map……

    就是 on 不能自动化好不爽有木有。

    求思路
    6 条回复
    hewigovens
        1
    hewigovens  
       2014-07-02 08:42:35 +08:00 via Android
    听上去是redis swift client?
    notcome
        2
    notcome  
    OP
       2014-07-02 09:06:59 +08:00 via iPhone
    @hewigovens 是的,封装了 Hiredis,已经被 C 指针玩死了 Swift 把 char[] 当 tuple 处理你造吗……
    notcome
        3
    notcome  
    OP
       2014-07-02 09:09:10 +08:00 via iPhone
    @hewigovens 目标是用 Swift 写服务器端代码,我想类似模板引擎这样的东西反正也能用 JavaScriptCore 解决(虽然不兼容 CommonJS 但比重写好多了……吧!),于是就去试试。

    没有类型系统的日子我已经受!够!了!
    notcome
        4
    notcome  
    OP
       2014-07-02 09:10:13 +08:00 via iPhone
    不过说实话,发 iDev 不合适……不过估计这里的人对 Swift 最熟了。
    notcome
        5
    notcome  
    OP
       2014-07-02 11:53:53 +08:00
    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)

    好冗余………………丑爆了。
    notcome
        6
    notcome  
    OP
       2014-07-02 11:54:46 +08:00
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2638 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 04:20 · PVG 12:20 · LAX 20:20 · JFK 23:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.