我在Swift 5.2中遇到了一个奇怪的元组销毁问题。我以为,从前一段时间以来,元组销毁在闭包参数中不起作用。实际上,以下内容不起作用:
let expected: ((Int, Int)) -> Void = { a, b in // does not compile
print(a, b)
}
但是,我注意到以下所有工作:
func weird(closure: @escaping ((Int, Int)) -> Void) {
closure((1, 3))
}
// I can understand this
weird { print($0.0 + $0.1) }
weird { a, b in print(a + b) }
// Surprise!
weird { print($0 + $1) }
weird { p in print(p.0 + p.1) }
最后两个示例在Swift 5.2之前有效吗?此行为记录在某处吗?
与该提案有关,该提案曾在Swift 4.0中被接受。
SE-0110 Distinguish between single-tuple and multiple-argument function types
因此,您的两个示例(虽然不是最后两个)在特定版本的Swift中引起了错误,但是Swift团队在此实现中发现了一些不可接受的回归。Additional Commentary
而且由于特定版本的Swift(我不记得确切的版本,它可能是4.0.x或4.1),所以您可以将两个参数闭包传递给带有单个元组的函数类型的参数。
最近,已确认此异常是SE-0110的一部分,如果需要更多修改,将提出新的建议并通过通常的Swift Evolution过程。
经审核的原始提案不包括特殊情况从
(T, U, ...) -> V
到((T, U, ...)) -> V
的功能转换论点。为了回应社区的反馈,这次转换是作为核心团队接受提案的一部分而添加。
Swift书可能没有对此行为的明确解释,但肯定是已记录。