我想在類型爲[String:SomeClass]的字典中存儲更專門化的類型。這是說明我的問題的一些示例代碼(也可在https://swiftlang.ng.bluemix.net/#/repl/579756cf9966ba6275fc794a一起玩):如何在Swift中的類型爲[String:Class <Protocol>]的Dictionary中存儲Class <ClassImplementingProtocol>類型的值?
class Thing<T> {}
protocol Flavor {}
class Vanilla: Flavor {}
var dict = [String:Thing<Flavor>]()
dict["foo"] = Thing<Vanilla>()
它產生錯誤ERROR at line 9, col 28: cannot assign value of type 'Thing<Vanilla>' to type 'Thing<Any>?'
。
我試過鑄造Thing<Vanilla>() as Thing<Flavor>
但產生錯誤cannot convert value of type 'Thing<Vanilla>' to type 'Thing<Flavor>' in coercion
。
我也嘗試將字典定義爲類型[String:Thing<Any>]
,但是這也不會改變任何東西。
如何創建一個不同的Thing
s的集合而不求助於簡單的[String:AnyObject]
?
我還要提到的是,類Thing
不是由我定義的(實際上它是關於BoltsSwift Task
S),因此該解決方案無需類型參數不起作用創建一個基類的Thing
。
泛型是不變的斯威夫特 - 有很好的理由了。假設你有一個'級巧克力:香料',然後是一個'事情'。現在讓我們假設你可以把'Thing '和'Thing '放在'[Thing ]'中。如果你的'Thing'類有一個'T'類型的屬性 - 你的數組現在說你可以在'Thing '或'Thing '這個屬性上分配'Chocolate()'或'Vanilla() '例子,這是瘋狂的。你試圖解決的實際問題是什麼? –
Hamish
我想創建一個BoltsSwift'Task's(或'TaskCompletionSource'es)集合以返回請求相同工作負載的調用者,同時處理它的請求已經在運行。 「任務」具有不同的類型,具體取決於特定工作負載返回的模型類型。所以我需要_some_方式來表達一種只說「任何」事物「的類型」。 – Mike
我決定使用'Protocol BaseThing {}','extension Thing:BaseThing',然後使用'[String:BaseThing]'作爲集合。不完全漂亮,但它的作品。 – Mike