gpt4 book ai didi

swift - 在 Swift 中类型转换闭包?

转载 作者:搜寻专家 更新时间:2023-10-31 08:34:06 24 4
gpt4 key购买 nike

似乎无法转换兼容参数和返回类型的闭包(向上或向下)。我想将回调数组存储在字典中,其中的键可用于确定回调参数的类型。仅仅类型转换是不行的:

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 )

它工作正常,但我当然在市场上寻求更简单的解决方案,如果有...

最佳答案

您尝试做的事情无法在 Swift 中完成(现在)。

这就像你试图将对象 Dog 转换为对象 Cat,具有以下实现:

class Cat {
var value: UIView!
}

class Dog {
var value: AnyObject!
}

我希望这会出现在 Swift 的 future 版本中。

关于swift - 在 Swift 中类型转换闭包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29512583/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com