2015-06-20 47 views
1

我試圖爲支持特定協議的每種類型實現泛型廣播函數。例如:自我作爲泛型回調的參數類型

protocol Proto { 
    typealias ItemType 
    typealias Callback = (Self, ItemType) 

    func register(tag: String, cb: Callback) 
    func unregister(tag: String) 
} 

class Foo : Proto { 
    typealias ItemType = Int 

    func register(tag: String, cb: (Foo, Int)) { 

    } 

    func unregister(tag: String) { 

    } 
} 

func bc <T: Proto> (p: T, value: T.ItemType, os: [String: T.Callback]) { 
    for (k, v) in os { 
     v(p, value) // error: cannot invoke v with argument list of... 
    } 
} 

的問題是如何實現bc功能吧?

+0

你是否試圖調用'T.Callback'的初始化程序? – ABakerSmith

+0

不,只是關閉。例如,'v'是對封閉的引用,添加在Foo.register中。目標是用相同的參數調用每個註冊的回調。 – HeMet

回答

1

我認爲swift在這個地方是越野車。也許你可以使用

protocol Proto { 
    typealias ItemType 

    func register(tag: String, cb: (Self, Self.ItemType)->()) 
    func unregister(tag: String, cb: (Self, Self.ItemType)->()) 
} 

class Foo : Proto { 

    func register(tag: String, cb: (Foo, Int)->()) { 

    } 
    func unregister(tag: String, cb: (Foo, Int)->()) { 

    } 
} 

func bc <T: Proto> (p: T, value: T.ItemType, os: [String : (T,T.ItemType)->()]) { 
    for (_, vc) in os { 
     vc(p, value) // error: cannot invoke v with argument list of... 
    } 
} 
+0

它的工作原理,感謝解決方法。主要缺點是它使你複製過去的類型定義。 – HeMet