在 Swift 中铸造闭包?
Casting closures in Swift?
兼容参数和 return 类型的闭包似乎无法转换(向上或向下)。我想将回调数组存储在字典中,其中的键可用于确定回调参数的类型。只是投射不行:
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 )
}
作为一种解决方法,可以将回调包装在一个通用的 class 中,它将处理参数类型转换:
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 )
它工作正常,但我当然在市场上寻求更简单的解决方案,如果有...
您正在尝试做的事情 Swift 无法完成(现在)。
这就像您试图将对象 Dog 转换为对象 Cat,具有以下实现:
class Cat {
var value: UIView!
}
class Dog {
var value: AnyObject!
}
我希望 Swift 的未来版本中会出现此功能。
兼容参数和 return 类型的闭包似乎无法转换(向上或向下)。我想将回调数组存储在字典中,其中的键可用于确定回调参数的类型。只是投射不行:
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 )
}
作为一种解决方法,可以将回调包装在一个通用的 class 中,它将处理参数类型转换:
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 )
它工作正常,但我当然在市场上寻求更简单的解决方案,如果有...
您正在尝试做的事情 Swift 无法完成(现在)。
这就像您试图将对象 Dog 转换为对象 Cat,具有以下实现:
class Cat {
var value: UIView!
}
class Dog {
var value: AnyObject!
}
我希望 Swift 的未来版本中会出现此功能。