当前位置: 首页 > 面试题库 >

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

华景明
2023-03-14
问题内容

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


问题答案:

让我们从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)
    }))
}


 类似资料:
  • 但这并不能说服我。因为Kotlin支持,而普通if在该角色中也很好。 我认为有时比普通的,尽管我想知道为什么Kotlin不支持?

  • 闭包定义 我们可以使用闭包的方式定义一些特殊需求的路由,而不需要执行控制器的操作方法了,例如: Route::get('hello', function () { return 'hello,world!'; }); 参数传递 闭包定义的时候支持参数传递,例如: Route::get('hello/:name', function ($name) { return 'Hello,'

  • 我正在尝试‘获取’一个rss提要。 当我检查“res”里面是什么的时候。它似乎得到了整个XML。但后来,我试图解码它,我得到:

  • 解释:这个问题更多的是关于Kotlin的设计意图。许多表达式语言同时支持和[例如,Ruby、Groovy.] 首先,我知道Groovy同时支持和:Groovy中的三元运算符。所以我不认为这是语法问题。 然后官方文件说: 在Kotlin中,if是一个表达式,即它返回一个值。因此不存在三元运算符(condition?then:else),因为普通if在这个角色中工作得很好。 这也不能说服我。因为Kot

  • 问题内容: 我无法连接到SQL Server,项目的连接字符串为: 我收到此错误: 不支持的关键字:“元数据” 如何解决此错误? 问题答案: 该连接字符串仅受实体框架支持。(公平地说,关键字“ entities”在键名中!)如果要在ADO原始连接中使用连接字符串,请除去字符串部分之外的所有内容,包括s: 更改为: