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

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

概述我想要做的事情的升华是这样的: public struct HolderOfWrappers{ let anyWrappedItem: MyResource<Any>}public struct MyResource<A>{ let wrappedItem : A let convert: String -> A}func holdResource<A>( 我想要做的事情的升华是这样的:

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的变量.如果我尝试使用任何一种语法,我会得到一个它期望类型的编译器错误.

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

这几乎就像我试图将泛型类型视为anyWrappedItem存储变量的协议,这不会因其他原因而起作用……

解决方法 我认为你可以通过在HolderOfWrappers init方法中放置一个泛型参数来做你想做的事.基本上,init方法只使用您提供的资源生成一个新的MyResource,如下所示:

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

我想这会做你想要的.我不知道它是否会慢,因为你正在初始化一个全新的MyResource而不是只复制一个.

无论如何,它使得HolderOfWrappers本身不是通用的,并且将使用MyResource< Any>填充anyWrappedItem.与您传入的资源保持相同的值.

总结

以上是内存溢出为你收集整理的Swift:如何在变量中保存泛型类型的任何可能实例全部内容,希望文章能够帮你解决Swift:如何在变量中保存泛型类型的任何可能实例所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/web/1003836.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存