2017-09-15 5 views
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プロトコルを避けるために、StringStoragewrapped引数の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)) 
    } 
} 
+0

より多くの文脈がなければ、 'wrapped.store(value:convert(value))'が何をしたいのかを正確に伝えるのは難しいので、正確な解決法を与えるのは難しいです。しかし、タイプラリアと 'wrapped'宣言を削除し、' store'を 'func store(value:String){ convert(value) }'として定義すると、あなたのコードは完璧にコンパイルされます。しかし、あなたの質問から、 'StringStorage'で' store'が何をすべきかは本当に明確ではありません。あなたが実際に望むものであるかどうかは分かりません。 –

+0

@DávidPásztor 'GenericStorage'型のラッパーを用意して、' Value'の実際の関連型が異なるかもしれないが、別の 'GenericStorage'でメソッドを呼びたいと思っています。私は言語の詳細に興味があります。 – Max

+0

が一般的に動作するためには、 'store'関数のデフォルトの実装を提供する必要があります(これは汎用関数となります)。そうでなければ、どのようにコンパイラが以前は 'GenericStorage'への準拠を指定していませんでした。 –

答えて

0

を、あなたは一般的なプロトコルにGenericStorageをオンにする必要があります。しかし、現時点では、プロトコルを汎用的にすることはできません。型制約はassociatedType(Swift4で導入された)またはプロトコルの関数にのみ追加できます。

汎用プロトコルの詳細については、Generics Manifestoを参照してください。

関連する問題