問題を示す私のコードの簡略版:
protocol Transformer {
typealias Input
typealias Output
func transform(s: Input) -> Output
}
protocol InputType {}
protocol OutputType {}
extension Int: OutputType {}
extension String: InputType {}
struct StringToInt: Transformer {
typealias Input = String
typealias Output = Int
func transform(s: Input) -> Output {
return s.characters.count
}
}
typealias Transform = InputType -> OutputType
func convert<T: Transformer where T.Input == InputType, T.Output == OutputType>
(transformer: T) -> Transform {
return transformer.transform
}
convert(StringToInt()) // error: Cannot invoke 'convert' with an argument list of type '(StringToInt)'
StringToInt
コンパイラがそれに到達して検証できずInput
、実際におよびそれぞれOutput
に準拠することができないため、エラーが発生すると推測しています。InputType
OutputType
私にとって、これを解決する最善の方法は、関連する型をプロトコルで直接制約することです。それはより表現力があり、コンパイラーはより多くの情報を持っています。しかし、ただやるだけではうまくいきtypealias Input: InputType
ません。
関連付けられた型を制約する方法はありますか?