Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays &引用;上下文闭包类型需要2个参数;在Swift 4中使用reduce时出错_Arrays_Swift_Reduce_Swift4_Equatable - Fatal编程技术网

Arrays &引用;上下文闭包类型需要2个参数;在Swift 4中使用reduce时出错

Arrays &引用;上下文闭包类型需要2个参数;在Swift 4中使用reduce时出错,arrays,swift,reduce,swift4,equatable,Arrays,Swift,Reduce,Swift4,Equatable,以下代码在Swift 3中编译 extension Array where Element: Equatable { var removeDuplicate: [Element] { return reduce([]){ $0.0.contains($0.1) ? $0.0 : $0.0 + [$0.1] } } } 但会产生错误 错误:上下文闭包类型“(?,?)->”需要2个参数,但闭包正文中使用了1个参数 在Swift 4中。如何将此代码转换为在Swift

以下代码在Swift 3中编译

extension Array where Element: Equatable {
    var removeDuplicate: [Element] {
        return reduce([]){ $0.0.contains($0.1) ? $0.0 : $0.0 + [$0.1] }
    }
}
但会产生错误

错误:上下文闭包类型“(?,?)->”需要2个参数,但闭包正文中使用了1个参数


在Swift 4中。如何将此代码转换为在Swift 4中编译?

传递到
reduce
的闭包采用两个参数,例如速记法中的
$0
$1

extension Array where Element: Equatable {
    var removeDuplicate: [Element] {
        return reduce([]) { $0.contains($1) ? $0 : $0 + [$1] }
    }
}
(这在Swift 3和Swift 4中都有汇编。)

在Swift 3中,您可以使用单个参数
$0
,该参数将被推断为包含元素
$0.0
$0.1
的元组。 这在Swift 4中不再可能,这是由于

下面是另一个例子来说明这种变化:这

let clo1: (Int, Int) -> Int = { (x, y) in x + y }
let clo2: ((Int, Int)) -> Int = { z in z.0 + z.1 }
两者都以Swift 3和Swift 4编译,但是

let clo3: (Int, Int) -> Int = { z in z.0 + z.1 }

仅在Swift 3中编译,而不在Swift 4中编译。

原始错误消息是由于代码中存在虚假的
(0)
。但即使没有这个错误,仍然存在一个快速的3到4转换问题。我冒昧地编辑了你的问题,希望对未来的读者更有用顺便说一句:我注意到你所有的问题都得到了答案,但到目前为止你从未接受过答案。如果你没有意识到这一点:接受答案很重要,因为它既可以奖励解决问题的海报,也可以告知其他人你的问题已经解决。有关更多信息,请参阅和。