ios - 闭包元组不支持 Xcode 9 Swift 4 中的解构

标签 ios swift swift4 xcode9-beta

Xcode 9 中 Swift 4 的 gloss 项目之后

我遇到了我不知道的错误

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)
        }))
    }
}

此时出现错误 try 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 类型Keyvalue 类型 Value)。


现在,如果您查看您的代码(在 Swift 3 中编译),您会发现情况并非如此,您应该问为什么这甚至可以在 Swift 3 中工作。

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

您的闭包采用 2 个参数而不是一个(key 类型为 Keyvalue 类型为 Value) .由于称为解构 的功能,编译器会自动将 2 个元素的元组转换为 2 个参数,这在 Swift 3 中有效。

但是这个特性很奇怪,很少使用,而且大多数时候会产生意想不到的结果,所以它在 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/44945967/

相关文章:

ios - 委托(delegate)有问题,我的委托(delegate)总是零,tvOS,swift 2.0

ios - 不能改变 Material

ios - 通过身份验证从网络获取图像

json - 在 Swift 中发送带有承载 token 和 json 正文的发布请求

uiviewcontroller - swift + Xcode 6 : What method is called when storyboard segue is performed

ios - 后台线程完成后的动画 (iOS/Swift)

ios - 为什么我要在 swift 中创建一个单例而不是仅仅将函数转储到一个文件中?

ios - 如何根据下载的图像大小创建动态大小的行高?

ios - UICollectionView didSelectItemAt 从不触发

ios - Xcode 9 卡在 Swift 4 迁移上