Swift静态闭包返回Type.Type而非Type的问题解决
解决SpaceInterpolatable协议合并操作的编译错误问题
你的问题出在关联类型和类型别名的嵌套引用上,编译器把Atom.joiner的返回值解析成了Atom.Atom(也就是Point.Point),自然无法匹配你想要的Atom(即Point)类型。下面给你两种修正方案:
方案一:直接使用具体类型调用joiner
不需要修改协议和扩展,只需要把合并操作的调用代码改成用具体类型Point代替关联类型Atom:
let newAtom = Point.joiner(particles)
这样编译器就能明确识别返回类型是Point,不会产生嵌套类型的混淆。
方案二:优化协议设计,移除不必要的关联类型
如果你希望在泛型场景下也能顺畅使用,可以重构协议,去掉多余的Atom关联类型,让joiner直接返回协议遵循者本身:
首先修改协议定义:
typealias DataBreaker = () -> [Double] typealias DataJoiner = (_ particles: [Double]) -> Self protocol SpaceInterpolatable { var breaker: DataBreaker { get } static var joiner: DataJoiner { get } }
然后更新Point的扩展实现:
extension Point: SpaceInterpolatable { var breaker: DataBreaker { return { [self.x, self.y] } } static var joiner: DataJoiner { return { particles in Point(x: particles[0], y: particles[1]) } } }
现在不管是直接调用Point.joiner(particles),还是在泛型约束(比如func process<T: SpaceInterpolatable>(...))中调用T.joiner(particles),都能正确返回T类型的实例,彻底避免类型嵌套的问题。
错误原因解析
你原来的协议中定义了关联类型Atom,而Point扩展把Atom设为了自身(Point)。由于Point又遵循了SpaceInterpolatable,它本身也会有一个Atom关联类型(也就是它自己),这就导致编译器在解析Atom.joiner时,把返回类型错误地识别为Atom.Atom(即Point.Point),和你期望的Atom(Point)类型不匹配,从而抛出编译错误。
内容的提问来源于stack exchange,提问作者艁ukasz
相关产品推荐
相关产品推荐

