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
プロトコルを避けるために、StringStorage
にwrapped
引数のData
の関連するタイプでGenericStorage
プロトコルを使用することはできますか?
私は、次のコード(動作しない)のようなものを期待:コメントに基づいて
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))'が何をしたいのかを正確に伝えるのは難しいので、正確な解決法を与えるのは難しいです。しかし、タイプラリアと 'wrapped'宣言を削除し、' store'を 'func store(value:String){ convert(value) }'として定義すると、あなたのコードは完璧にコンパイルされます。しかし、あなたの質問から、 'StringStorage'で' store'が何をすべきかは本当に明確ではありません。あなたが実際に望むものであるかどうかは分かりません。 –
@DávidPásztor 'GenericStorage'型のラッパーを用意して、' Value'の実際の関連型が異なるかもしれないが、別の 'GenericStorage'でメソッドを呼びたいと思っています。私は言語の詳細に興味があります。 – Max
が一般的に動作するためには、 'store'関数のデフォルトの実装を提供する必要があります(これは汎用関数となります)。そうでなければ、どのようにコンパイラが以前は 'GenericStorage'への準拠を指定していませんでした。 –