Swift 5.2元组在闭包中的结构具有不一致的行为

问题描述 投票:0回答:1

我在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 tuples swift5 destructuring swift5.2
1个回答
1
投票

与该提案有关,该提案曾在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过程。

Update on SE-0110 and SE-0155

经审核的原始提案不包括特殊情况从(T, U, ...) -> V((T, U, ...)) -> V的功能转换论点。为了回应社区的反馈,这次转换是作为核心团队接受提案的一部分而添加。

Swift书可能没有对此行为的明确解释,但肯定是已记录

© www.soinside.com 2019 - 2024. All rights reserved.