我一直在尝试在 Swift 的数组扩展中实现一个函数,该函数返回数组的所有排列。当我在 Xcode 中运行这段代码时,它似乎工作得很好。然而,当我在 LeetCode 中尝试相同的代码时,遇到了以下错误:
Line 10: Char 24: error: cannot convert value of type 'Array<Element>' to closure result type 'Element'
[tar] + ac
这是我的代码片段:
extension Array {
func permute() -> [[ Element ]] {
guard !isEmpty else { return [[]] }
return (0...count-1).flatMap { i in
var dup = self
let tar = dup.remove(at: i)
return dup.permute().map { ac in
[tar] + ac
}
}
}
}
导致问题的行是 [tar] + ac。我很困惑,因为 Xcode 和 LeetCode 之间的行为不一致。我该如何解决这个问题,以便它可以在两个平台上运行?
我尝试过的: 我在 Swift 中实现了一个数组扩展来生成数组的所有排列。我采取的方法是递归地分解问题,删除每个元素并获得其余元素的排列。然后我会将删除的元素与这些排列组合起来。
预期结果: 我期望我的 permute() 函数返回输入数组的所有可能的排列。在 Xcode 中测试时,它提供了正确的结果,每个排列都是一个单独的数组。
实际结果: 当我将代码传输到 LeetCode 并尝试运行它时,我在 [tar] + ac 行上遇到了编译时错误。错误指出:
这很令人惊讶,因为 Xcode 中没有这样的问题。
Leetcode 似乎使用的是较旧版本的 Swift,可能是 Swift 5.6,因为使用 5.6 编译器在 Swiftfiddle 上也可以重现该错误。
您只需键入注释闭包的返回值,您的代码也可以使用 Swift 5.6 正常编译。请参阅this Swiftfiddle 游乐场。在 Swift 5.7 及更高版本中不需要执行此操作的原因是 SE-0326,它已在 Swift 5.7 中实现并启用了多语句闭包返回类型推断。
extension Array {
func permute() -> [[ Element ]] {
guard !isEmpty else { return [[]] }
return (0...count-1).flatMap { i -> [[Element]] in
var dup = self
let tar = dup.remove(at: i)
return dup.permute().map { ac -> [Element] in
[tar] + ac
}
}
}
}