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

标签 ios swift swift4 xcode9-beta

在 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 类型 Keyvalue 类型 Value )。

<小时/>

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

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

您的闭包需要 2 个参数,而不是一个( key 类型为 Keyvalue 类型为 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/

相关文章:

ios - 使用 NSPredicate 在自定义对象的 NSArray 中搜索字符串

ios - 如何将 iPhone 用作 OS X、iOS 或 tvOS 的游戏 Controller

android - 使用 Spring 为 Web/ native 应用程序托管自己的 sso Oauth2 服务的最佳方式

iphone - 在 uitableview 中删除行

ios - NSCalendar 日期周数

swift - 如何使用 Xcode 对象库为 Cocoa Swift 构建插入删除表单?

ios - 努力将 NSArray 解析为带有分隔符的字符串,以快速生成 QR 码

swift - 如何更改其他 CollectionView 中具有特定部分的所有项目的 isUserInteractionEnable ?

ios - Swift 在只有括号的行上崩溃

ios - 比较两个 [String : Any] dictionaries in Swift 4