3
似乎兼容參數和返回類型的閉包不能被轉換(向上或向下)。我想在Dictionary中存儲回調數組,其中的鍵可以用來確定回調參數的類型。只是投放不會做:斯威夫特鑄造關閉?
typealias AnyCallback = (value: AnyObject)-> Void
typealias SpecializedCallback = (value: UIView) -> Void
let callback : SpecializedCallback =
{
(value: UIView) in
println(value)
}
if let castCallback : AnyCallback = callback as? AnyCallback
{
// block never executed
println("did cast callback")
castCallback(value: self.view)
}
作爲一種變通方法,可以包裹回調泛型類,它將處理參數的類型轉換:
final class GenericCallback<T>
{
func executeCallback(value: Any?) -> Void
{
if let specificValue = value as? T
{
specificCallback(value: specificValue)
}
}
init(callback: (value: T?)->Void)
{
self.specificCallback = callback
}
private let specificCallback : (value: T?)->Void
}
由於executeCallback捕捉自我,它可以直接安全地加入到回調的陣列,無需將保持到包裝材料的引用:
typealias GenericCallbackType = (value: Any?) -> Void
var callbackArray : [ GenericCallbackType ] = []
let specializedCallback =
{
(value: UIView?) -> Void in
println(value)
}
let wrappedCallback = GenericCallback(callback: specializedCallback)
callbackArray.append(wrappedCallback.executeCallback)
它工作正常,但當然我在市場上是一個簡單的解決方案應該有一個...
感謝您的意見。現在我會堅持使用我的包裝解決方案... – Gregzo