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