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
相关产品推荐
相关产品推荐

