在 Xcode 9 中的 Swift 4 光泽项目之后
我收到以下错误,我不知道
Closure tuple parameter '(key: _, value: _)' does not support destructuring
代码:
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)
}))
}
}
此时出现错误尝试 flatMap({ (key, value)in
最佳答案
让我们从 flatMap
的定义开始对于以下字典:
func flatMap(_ transform: (Element) throws -> ElementOfResult?) rethrows -> [ElementOfResult]
您会看到 transform
闭包仅采用 Element
类型的一个参数哪里Element
只是一个 typealias
对于元组:
public typealias Element = (key: Key, value: Value)
因此,闭包的第一个也是唯一参数应该是两个元素的元组( key
类型 Key
和 value
类型 Value
)。
现在,如果您查看代码(在 Swift 3 中编译),您会发现情况并非如此,您应该问为什么这在 Swift 3 中也能工作。
try flatMap({ (key, value) in
return try transform(key, value)
})
您的闭包需要 2 个参数,而不是一个( key
类型为 Key
和 value
类型为 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)
}))
}
关于ios - 闭包元组不支持 Xcode 9 Swift 4 中的解构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45879670/