2015-07-19 45 views
0

可以將帶有子類型參數的閉包傳遞給接受帶有父類型參數的閉包的函數?這是我想要通過我的封閉。從Event傳遞帶子參數類型的閉包

func on(name:String,callback:(Event) ->()){ ... } 

這裏MoveEvent繼承是我調用該函數:

symbol.on("move",{ (event:MoveEvent) ->() in 
    ... 
}); 

當我嘗試這一點,Xcode中說,我不能使用這些參數調用它

回答

1

你可以做到這一點帶仿製藥:

class Event {} 

class MoveEvent: Event {} 

func on<T: Event>(name:String, callback:(T) ->()) {} 

on("move", callback: { (event: MoveEvent) ->() in 
    ... 
}); 

on("other", callback: { (event: Event) ->() in 
    ... 
}); 

但是除此之外,signatu當您調用on(_:callback:)函數時,您正在定義的閉包的重新定義必須與用作參數類型的閉包簽名匹配 - 也就是說,對於event參數的類型,您必須使用Event而不是MoveEvent。如果您希望傳入MoveEvent,則必須將其從Event轉換爲該類型。

symbol.on("move",{ (event:Event) ->() in 
    if let moveEvent = event as? MoveEvent { 
     ... 
    } 
}); 
+0

鑄造實際上是我現在正在做的,我只是想知道如果沒有額外的語法swift可以以某種方式投給我。但我想這是不可能的。不過我會看看泛型。謝謝。 –