は、私が唯一それが両方のプロトコルに準拠しているためTestThingC
を構造体へ適用される拡張機能を記述しようとしているこれらのプロトコルSwift 4では、複数のプロトコルに準拠するものにのみ適用される拡張機能を記述できますか?
protocol NamedThing{
var name:String{ get }
}
protocol ValuedThing{
associatedtype ValueType
var value:ValueType{ get }
}
そして、これらの構造体...
struct TestThingA : NamedThing {
let name = "TestThing"
}
struct TestThingB : ValuedThing {
typealias ValueType = Int
let value = 4
}
struct TestThingC : NamedThing, ValuedThing {
typealias ValueType = Int
let name = "TestThing"
let value = 4
}
を考えてみましょう。これらの作業の
いずれも、もちろん...
extension NamedThing & ValuedThing{
func test(){
print("Named thing \(name) has a value of \(value)")
}
}
extension Any where NamedThing & ValuedThing {
func test(){
print("Named thing \(name) has a value of \(value)")
}
}
extension Any where Self is NamedThing, Self is ValuedThing{
func test(){
print("Named thing \(name) has a value of \(value)")
}
}
extension Any where Self == NamedThing, Self == ValuedThing{
func test(){
print("Named thing \(name) has a value of \(value)")
}
}
それでは、どの一つは、両方の(複数の)プロトコルに準拠したアイテムに適用される拡張機能を記述しないのでしょうか?あなたはプロトコルの1に制限された拡張子を定義することができ
これは技術的にプロトコルの1つに拡張されているにもかかわらず、実質的にはその組み合わせに拡張されています。つまり、拡張子ValuedThing where Self:NamedThingと同じ結果を得ます。 – rickster
私は実際には、元々2つのwhere句で 'Any'を拡張することを考えましたが、コンパイラはそれを気に入らず、私の道を邪魔しました。それは面白いです...私は1つのプロトコルを拡張することを考慮しなかったし、まったく同じことをしたwhere節で他のプロトコルを使用することさえ考えませんでした。 @ricksterのように、注文は関係ありません。本当にきれい!受け入れられる! – MarqueIV