0

我在 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 之前有效吗?这种行为是否记录在某处?

4

1 回答 1

2

它与这个提案有关,该提案曾在 Swift 4.0 中被接受。

SE-0110 区分单元组和多参数函数类型

所以,你的两个例子(不是最后两个)在某个版本的 Swift 中导致了错误,但是 Swift 团队在这个实现中发现了一些不可接受的回归。 附加评论

并且由于 Swift 的某个版本(我不记得确切的版本,它可能是 4.0.x 或 4.1),您可以将两个参数闭包传递给采用单个元组的函数类型的参数。

最近,这个例外被确认为 SE-0110 的一部分,如果需要进行更多修改,将提出新的提案并通过通常的 Swift Evolution 流程。

SE-0110 和 SE-0155 的更新

经审查的原始提案不包括函数参数的特殊情况(T, U, ...) -> V转换((T, U, ...)) -> V。作为对社区反馈的回应,这一转换被添加为核心团队接受提案的一部分。

Swift 的书可能没有对这种行为做出明确的解释,但它肯定是有记录的。

于 2020-04-29T09:39:41.267 回答