我的代码的简化版本显示了问题:
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
是行不通的。
有没有办法限制关联类型?