让我们从
flatMap以下的字典定义开始:
func flatMap(_ transform: (Element) throws -> ElementOfResult?) rethrows -> [ElementOfResult]
您会看到
transform闭包仅接受 一个 类型的 参数 ,
Element其中
Element仅
typealias是元组的a:
public typealias Element = (key: Key, value: Value)
因此,闭包的第一个 也是唯一的 参数应该是两个元素(
keytype
Key和
valuetype
Value)的元组。
现在,如果您看一下代码(在Swift 3中编译),您会发现情况并非如此,并且您应该问为什么在Swift 3中也能工作。
try flatMap({ (key, value) in return try transform(key, value)})您的闭包使用2个参数,而不是一个(
keytype
Key和
valuetype
Value)。由于有一种称为 解构
的功能,该功能可在Swift 3中工作,在该功能下,编译器会将2个元素的元组自动转换为2个参数。
但是此功能很奇怪,很少使用,并且在大多数情况下会产生意想不到的结果,因此已在Swift 4中删除。
编辑 :如OOPer所指出,此功能已在Swift 4 beta中暂时删除,但应在之前重新添加最终版本已经发布。
相反,您应该写:
try flatMap({ tupleArgument in return try transform(tupleArgument.key, tupleArgument.value)})并且您的
flatMap功能变为:
func flatMap<KeyPrime, ValuePrime>(_ transform: (Key, Value) throws -> (KeyPrime, ValuePrime)?) rethrows -> [KeyPrime:ValuePrime] { return Dictionary<KeyPrime, ValuePrime>(elements: try flatMap({ element in return try transform(element.key, element.value) }))}


