You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift 5.9参数包报错:'each V'仅能出现在包展开中,求助排查

Swift 5.9可变泛型重构autoResolve函数报错解决

问题背景

尝试用Swift 5.9的可变泛型(variadic generic)特性,将多个重载的autoResolve函数:

func resolve<T>() -> T {
    // Resolve method
}

func autoResolve<T>(_ initializer: () -> T) -> T { initializer() }
func autoResolve<T, A>(_ initializer: (A) -> T) -> T { initializer(resolve()) }
func autoResolve<T, A, B>(_ initializer: (A, B) -> T) -> T { initializer(resolve(), resolve()) }
func autoResolve<T, A, B, C>(_ initializer: (A, B, C) -> T) -> T { initializer(resolve(), resolve(), resolve()) }
func autoResolve<T, A, B, C, D>(_ initializer: (A, B, C, D) -> T) -> T { initializer(resolve(), resolve(), resolve(), resolve()) }
func autoResolve<T, A, B, C, D, E>(_ initializer: (A, B, C, D, E) -> T) -> T { initializer(resolve(), resolve(), resolve(), resolve(), resolve()) }

重构为单个使用参数包的函数:

func autoResolve<T, each V>(_ initializer: (repeat each V) -> T) -> T { initializer(repeat each resolve()) }

但出现错误提示:Pack reference 'each V' can only appear in pack expansion

错误原因与解决方法

错误原因

报错核心在于:Swift无法自动推断resolve()调用对应的泛型类型,each V作为参数包元素,需要在包展开时明确绑定到resolve的泛型参数上。原代码中resolve()未指定类型,导致参数包的类型关联断裂,违反了参数包的使用规则。

修正后的代码

func autoResolve<T, each V>(_ initializer: (repeat each V) -> T) -> T {
    initializer(repeat each resolve<each V>())
}

说明

通过显式指定resolve<each V>(),将参数包中的每个V类型绑定到resolve函数的泛型参数上,确保每个resolve调用都返回对应V类型的实例,完美匹配初始化器的参数列表要求。修正后的代码可完全替代之前所有的重载函数,实现任意数量参数的自动解析逻辑。

内容的提问来源于stack exchange,提问作者Mickael Belhassen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 11:52:23