一尘不染

封闭元组不支持Xcode 9 Swift 4中的解构

swift

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


阅读 220

收藏
2020-07-07

共1个答案

一尘不染

让我们从flatMap以下的字典定义开始:

func flatMap(_ transform: (Element) throws -> ElementOfResult?) rethrows -> [ElementOfResult]

您会看到transform闭包仅接受 一个 类型的 参数Element其中Elementtypealias是元组的a:

public typealias Element = (key: Key, value: Value)

因此,闭包的第一个 也是唯一的 参数应该是两个元素(keytype Keyvaluetype Value)的元组。


现在,如果您看一下代码(在Swift 3中编译),您会发现情况并非如此,并且您应该问为什么在Swift 3中也能工作。

try flatMap({ (key, value) in
    return try transform(key, value)
})

您的闭包使用2个参数,而不是一个(keytype Keyvaluetype 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)
    }))
}
2020-07-07