Xcode 9中Swift 4的光泽项目之后
我收到以下错误,我不知道
闭包元组参数’(键:,值:)’不支持解构
码:
extension Dictionary { init(elements: [Element]) { self.init() for (key, value) in elements { self[key] = value } } func flatMap<KeyPrime, ValuePrime>(_ transform: (Key, Value) throws -> (KeyPrime, ValuePrime)?) rethrows -> [KeyPrime:ValuePrime] { return Dictionary<KeyPrime, ValuePrime>(elements: try flatMap({ (key, value) in return try transform(key, value) })) } }
此时出现错误 try flatMap({ (key, value)in
try flatMap({ (key, value)in
让我们从flatMap以下的字典定义开始:
flatMap
func flatMap(_ transform: (Element) throws -> ElementOfResult?) rethrows -> [ElementOfResult]
您会看到transform闭包仅接受 一个 类型的 参数 ,Element其中Element仅typealias是元组的a:
transform
Element
typealias
public typealias Element = (key: Key, value: Value)
因此,闭包的第一个 也是唯一的 参数应该是两个元素(keytype Key和valuetype Value)的元组。
key
Key
value
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) })) }