2017-04-11 7 views
-3
protocol PubSubEvent { 
    associatedtype EventResult 
    static func eventName() -> String 
    func event() -> EventResult 
    func send() 
} 

class BGEventBus: EventBus { 

    static let sharedInstance = BGEventBus() 

    init() { 
     super.init(queue: OperationQueue()) 
    } 

} 


class BGEventBusEvent: PubSubEvent { 

    typealias EventResult = BGEventBusEvent 

    class func eventName() -> String { 
     return String(describing: self) 
    } 

    func send() { 
     BGEventBus.sharedInstance.send(event: self) 
    } 

    func event() -> BGEventBusEvent.EventResult { 
     return self 
    } 
} 


class BGDidLoginEvent: BGEventBusEvent { 
    typealias EventResult = BGDidLoginEvent 

    var password: String? 
    var facebookToken: String? 

    init(password: String? = nil, facebookToken: String? = nil) { 
     self.password = password 
     self.facebookToken = facebookToken 
    } 

} 


class EventBus { 

    var queue: OperationQueue 

    init(queue: OperationQueue) { 
     self.queue = queue 
    } 

    func send(event: AnyObject) { 

    } 

    func handleEvent<T: PubSubEvent>(target:EventBusObservable, handleBlock: ((T.EventResult) -> Void)!) where T.EventResult == T { 

    } 

} 

class EventBusObserver { 

    var objectProtocol: NSObjectProtocol? 

    func addObserver(forName name: NSNotification.Name?, object obj: Any?, queue: OperationQueue?, using block: @escaping (Notification) -> Swift.Void) { 
     self.objectProtocol = NotificationCenter.default.addObserver(forName: name, object: obj, queue: queue, using: block) 
    } 

    deinit { 
     if let obj = self.objectProtocol { 
      NotificationCenter.default.removeObserver(obj) 
     } 
     self.objectProtocol = nil 
     print("deinit observer!") 
    } 
} 

protocol EventBusObservable { 
    func handleBGEvent<T: PubSubEvent>(handleBlock: ((T.EventResult) -> Void)!) where T.EventResult == T 
} 

extension EventBusObservable { 
    func handleBGEvent<T>(handleBlock: ((T) -> Void)!) where T : PubSubEvent, T.EventResult == T { 
     BGEventBus.sharedInstance.handleEvent(target: self, handleBlock:handleBlock) 
    } 
} 

class sample: EventBusObservable { 
    func test() { 
     self.handleBGEvent { (event: BGDidLoginEvent) in 

     } 
    } 
} 

こんにちはみんなは私が8.3にXcodeのを更新し、今私はこのようないくつかのエラー取得しています:のXcode 8.3エラーが

型の値を変換できません「(BGDidLoginEventを) - >()」期待される引数型 '((_) - > Void)!' '

誰でも助けてくれますか?ここ

サンプルファイルhttps://drive.google.com/open?id=0B1zPtsTG7crPQncxYnEyWTBpSXM

+0

'' 'クラスBGEventBus:EventBus { 静的sharedInstance = BGEventBusを聞かせて() のinit(){ でsuper.init(キュー:OperationQueue() ) } } '' ' –

+0

サンプルコード –

+0

を更新しました。ありがとうございました。ここには、https://drive.google.com/open?idというエラーを複製するためのすべてのコードが含まれています= 0B1zPtsTG7crPQncxYnEyWTBpSXM、ありがとう。 –

答えて

0

私はあなたが一般的な要件を毎回正確に同じように書かなければならないと思います。だから、EventBus中:EventBusObservableで

class EventBus { 
    // ... 
    func handleEvent<T>(target:EventBusObservable, handleBlock: ((T) -> Void)!) where T : PubSubEvent, T.EventResult == T { 
    } 
} 

:EventBusObservable延長で

protocol EventBusObservable { 
    func handleBGEvent<T>(handleBlock: ((T) -> Void)!) where T : PubSubEvent, T.EventResult == T 
} 

:コンパイル

extension EventBusObservable { 
    func handleBGEvent<T>(handleBlock: ((T) -> Void)!) where T : PubSubEvent, T.EventResult == T { 
     BGEventBus.sharedInstance.handleEvent(target: self, handleBlock: handleBlock) 
    } 
} 

。最後に、クラスsampleが残っています。これはあまり簡単ではありませんでした。私はBGEventBusEventとしてeventを宣言する必要がありましたが見つかりました:

class sample: EventBusObservable { 
    func test() { 
     self.handleBGEvent { 
      (event:BGEventBusEvent) in 
     } 
    } 
} 
関連する問題