Arrays &引用;上下文闭包类型需要2个参数;在Swift 4中使用reduce时出错
以下代码在Swift 3中编译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
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转换问题。我冒昧地编辑了你的问题,希望对未来的读者更有用顺便说一句:我注意到你所有的问题都得到了答案,但到目前为止你从未接受过答案。如果你没有意识到这一点:接受答案很重要,因为它既可以奖励解决问题的海报,也可以告知其他人你的问题已经解决。有关更多信息,请参阅和。