的什么,我试图做的是这样的蒸馏:斯威夫特:如何保持一个泛型类型的任何可能的情况下在一个变量
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只能适用于任何类型的,不属于任何可能的类型建立了一个MyResource。我与HolderOfWrappers
后我真的是这样的:
public struct HolderOfWrappers
{
let anyWrappedItem: MyResource<>
}
甚至MyResource<*>
- 我想这个代码,我想,可以容纳任何类型MyResource的变量说。如果我尝试使用任何一种语法,我都会得到一个它期望的类型的编译器错误。
我可以只有anyWrappedItem
类型Any
,但然后你失去了类型信息供将来使用。我也不希望HolderOfWrapper是通用的(因为后来我只是有同样的问题)。
这几乎就像我试图把泛型类型作为anyWrappedItem
存储变量的协议,不会因为其他原因工作...
实际上似乎是同样的情况矿山这里 http://stackoverflow.com/questions/28250294/dictionary-with-string-as-key-and-generic-class-as-value 由于MyResource和MyResource 似乎是完全无关的类形成编译器点的观点,你将不得不MyResource 像MyResourceBase somethinh。但是,那不适用于结构体.. –
Alex
2015-02-09 10:57:18
感谢您指出这一点,我没有在搜索中遇到这个问题 - 我宁愿使用基类而不是使用Any作为存储类型......它也是让我有我可以期待的方法签名。无论如何,这个结构是需要成为一个班级的边缘,叹息。 – 2015-02-09 17:53:46