protocol P { func hoge(_ a: Int) func hoge(_ a: String) } protocol IntOrString {} extension Int : IntOrString {} extension String : IntOrString {} struct S : P { func hoge<X>(_ a: X) { print("X") } } extension P { func hoge(_ a: Int) { print("default Int") } } let s = S() s.hoge(1) // default Int s.hoge("a") // X