0
下面的代碼工作:我可以使用具有指定關聯類型的協議嗎?
protocol GenericStorage {
associatedtype Value
func store(value: Value)
}
protocol DataStorage {
func store(value: Data)
}
struct StringStorage: GenericStorage {
typealias Value = String
let wrapped: DataStorage
func convert(_ str: String) -> Data {
return Data(str.utf8)
}
func store(value: String) {
wrapped.store(value: convert(value))
}
}
我可以以完全避免冗餘DataStorage
協議使用GenericStorage
協議與相關聯的類型的Data
爲wrapped
論點StringStorage
?
我希望類似如下的代碼(不工作):
protocol GenericStorage {
associatedtype Value
func store(value: Value)
}
struct StringStorage: GenericStorage {
typealias Value = String
let wrapped: GenericStorage where Value = Data
func convert(_ str: String) -> Data {
return Data(str.utf8)
}
func store(value: String) {
wrapped.store(value: convert(value))
}
}
沒有更多的上下文,它很難給你一個確切的解決方案,因爲很難判斷你想要什麼'wrapped.store(value:convert(value))'來做什麼。但是,如果您刪除typealias,'wrapped'聲明並將'store'定義爲'func store(value:String){convert(value) }',那麼您的代碼編譯完全正常。但是從你的問題來看,'StringStorage'中'store'應該做什麼並不是很清楚,我不知道這是你真正想要的。 –
@DávidPásztor我想要一個類型爲'GenericStorage'的包裝器,它調用另一個'GenericStorage'上的方法,儘管'Value'的實際關聯類型可能不同。我對語言細節感興趣。 – Max
爲了一般工作,您需要提供'store'函數(可能是一個通用函數)的默認實現,否則編譯器如何通過調用該類型的函數來推斷您的意思是什麼你之前沒有指定符合'GenericStorage'。 –