Swift中`Cannot build rewrite system for generic signature`错误修复咨询
解决递归错误+实现GenericBuilder的泛型扩展
为啥会报错?
你碰到的Cannot build rewrite system for generic signature; rule length limit exceeded是循环泛型约束搞出来的:
原来的扩展写了T == SomeUseCase<T.AssociatedEntity>,但SomeUseCase里的AssociatedEntity就是它自己的泛型参数T,等于说T要等于SomeUseCase<SomeUseCase<SomeUseCase<...>>>,无限套娃,编译器根本解析不了,直接报错。
怎么解决?
方案1:直接约束T是SomeUseCase类型
既然你要的是所有SomeUseCase实例都能用上这个扩展,完全不用绕AssociatedEntity,直接改约束就行:
// 把原来的错误扩展换成这个 extension GenericBuilder where T: SomeUseCase { // 这里加你要的特定函数 func someSpecificFunc() { // 实现逻辑 } }
这个约束的意思是:只要GenericBuilder的T是SomeUseCase<任意Entity>的实例,就自动拥有这个扩展里的函数,完美匹配你的需求,还彻底避免了递归问题。
方案2:加个标识协议(可选,更灵活)
如果以后要给其他类型也复用这个扩展逻辑,可以整个空协议当标识:
// 整个空协议,就用来标记哪些类型能用这个扩展 protocol SomeUseCaseTag: Model {} // 让SomeUseCase实现这个协议 struct SomeUseCase<T: Entity>: Model, SomeUseCaseTag { typealias AssociatedEntity = T // 原来的代码不动 } // GenericBuilder扩展约束到这个标识协议 extension GenericBuilder where T: SomeUseCaseTag { // 写你的特定函数 }
以后要是有别的类型也需要这个扩展,只要让它实现SomeUseCaseTag就行,不用改GenericBuilder的代码。
关于any类型的问题
你说用any SomeProtocol会提示不符合Codable/Hashable/Equatable,这很正常——any是存在类型,协议本身没实现这些方法,只是要求遵循者实现。但上面两种方案都是用泛型约束(where T: XXX),针对的是具体的遵循类型,这些具体类型已经符合Model的所有要求了,所以不会有这个问题。
内容的提问来源于stack exchange,提问作者Tiny Tim
相关产品推荐
相关产品推荐

