在 Swift 数组扩展中组合元素和数组时出错 - 在 Xcode 中有效,但在 LeetCode 中无效

问题描述 投票:0回答:1

我一直在尝试在 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 中没有这样的问题。

swift closures
1个回答
0
投票

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 } } } }
    
© www.soinside.com 2019 - 2024. All rights reserved.