Swift Result Builder兼容两类输入时buildBlock匹配错误求助
问题原因及解决办法
核心问题:Result Builder的buildBlock未适配混合类型参数
你遇到的报错本质是当前Result Builder的buildBlock方法,没有处理同时接收ModelBuilder实例和ViewFactory对象的场景:
HeaderSubtitleBuilder属于ModelBuilder类型,是尚未生成ViewFactory的构建器实例;HeaderTitleWithButtonBuilder.generate()直接返回了ViewFactory,是已经生成完成的最终产物;- 当你把这两种不同类型的元素放在同一个闭包里时,Result Builder找不到能匹配这种混合参数的
buildBlock重载,因此报出匹配失败的错误。
需要补充的处理逻辑
你需要给Result Builder添加两类关键的buildBlock重载:
- 单参数基础重载:分别处理单个ModelBuilder或单个ViewFactory,将它们转换为统一的
[ViewFactory]类型static func buildBlock<T: ModelBuilder>(_ builder: T) -> [ViewFactory] { return [builder.generate()] } static func buildBlock(_ factory: ViewFactory) -> [ViewFactory] { return [factory] } - 多参数混合重载:支持ModelBuilder与ViewFactory的各种组合,通过调用基础重载拼接结果
// 处理两个参数的混合情况 static func buildBlock<T: ModelBuilder>(_ builder: T, _ factory: ViewFactory) -> [ViewFactory] { return buildBlock(builder) + buildBlock(factory) } static func buildBlock<T: ModelBuilder>(_ factory: ViewFactory, _ builder: T) -> [ViewFactory] { return buildBlock(factory) + buildBlock(builder) } // 若需支持更多参数,可继续扩展,比如三个参数的混合场景 static func buildBlock<T1: ModelBuilder, T2: ModelBuilder>(_ b1: T1, _ f: ViewFactory, _ b2: T2) -> [ViewFactory] { return buildBlock(b1) + buildBlock(f) + buildBlock(b2) }
额外说明
Result Builder的核心逻辑是通过buildBlock等方法,将闭包内的所有元素转换为统一的输出类型。你的场景需要将两种输入(未生成的构建器、已生成的工厂对象)最终统一为[ViewFactory],因此必须确保buildBlock能覆盖所有可能的参数组合,包括混合类型的情况。
如果容器型的StackModelBuilder也需要参与这种混合场景,还要保证它的buildBlock实现能和上述重载兼容,最终输出统一的ViewFactory类型。
内容的提问来源于stack exchange,提问作者benoitcn
相关产品推荐
相关产品推荐

