gpt4 book ai didi

Swift:如何在变量中保存泛型类型的任何可能实例

转载 作者:搜寻专家 更新时间:2023-10-31 19:31:25 26 4
gpt4 key购买 nike

我想做的事情的提炼是这样的:

public struct HolderOfWrappers
{
let anyWrappedItem: MyResource<Any>
}

public struct MyResource<A>
{
let wrappedItem : A
let convert: String -> A
}

func holdResource<A>( resource: MyResource<A> ) -> HolderOfWrappers
{
// Error on this line, A is not Any...
let wrapHolder : HolderOfWrappers = HolderOfWrappers( resource )
return wrapHolder
}

就目前而言,此代码在最后一个 holdResource 中产生编译器错误我尝试构建 HolderOfWrappers 的方法:

Cannot convert the expression's type 'MyResource<A>' to type '(anyWrappedItem: MyResource<Any>)'

这是可以理解的,因为代码表明 HolderOfWrappers 只能保存为 Any 类型构建的 MyResource,而不是任何可能的类型。我真正想要的是 HolderOfWrappers是这样的:

public struct HolderOfWrappers
{
let anyWrappedItem: MyResource<>
}

甚至MyResource<*> - 我试图用这段代码说我想要一个可以保存任何类型的 MyResource 的变量。但是,如果我尝试使用任何一种语法,我都会收到一个编译器错误,它需要一个类型。

我可以有 anyWrappedItem按类型 Any ,但是您会丢失类型信息以备将来使用。我也不希望 HolderOfWrappers 是通用的(因为那样我以后就会遇到同样的问题)。

这几乎就像我试图将泛型类型视为 anyWrappedItem 的协议(protocol)一样存储变量,由于其他原因将不起作用...

最佳答案

我认为你可以通过在 HolderOfWrappers 中放置一个通用参数来做你想做的事init方法。基本上,init方法只是生成一个新的 MyResource使用 resource你提供的,像这样:

public struct HolderOfWrappers {

let anyWrappedItem: MyResource<Any>

public init<A>(resource: MyResource<A>) {
self.anyWrappedItem = MyResource(wrappedItem: resource.wrappedItem, convert: resource.convert)
}
}

我认为这会如您所愿。我不知道它是否会变慢,因为您正在初始化一个全新的 MyResource而不是仅仅复制一个。

无论如何,它使得 HolderOfWrappers本身不是通用的,将填充 anyWrappedItemMyResource<Any>resource 具有相同的值你传入的。

关于Swift:如何在变量中保存泛型类型的任何可能实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28406461/

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