我在SWIFT5.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) }在斯威夫特5.2之前,最后两个例子有效吗?这种行为在什么地方有记录吗?
发布于 2020-04-29 09:39:41
这与Swift 4.0曾被接受的这一提议有关。
因此,您的两个示例(虽然不是最后两个)在Swift的某个版本中导致了错误,但是Swift团队在这个实现中发现了一些不可接受的回归。补充评注
由于Swift的某个版本(我不记得确切的版本,可能是4.0.x或4.1),您可以将两个参数闭包传递给函数类型的参数,即一个元组。
最近,这一例外被确认为SE-0110的一部分,如果需要更多的修改,将提出一个新的提案,并通过通常的Swift进化过程。
审查后的原始建议不包括函数参数从
(T, U, ...) -> V到((T, U, ...)) -> V的特例转换。作为对社区反馈的回应,这一转换是作为核心小组接受建议的一部分而增加的。
Swift的书可能没有明确的解释这种行为,但它肯定是有记录的。
https://stackoverflow.com/questions/61498023
复制相似问题