的什麼,我試圖做的是這樣的蒸餾:斯威夫特:如何保持一個泛型類型的任何可能的情況下在一個變量
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