提问人:Kang 提问时间:8/15/2023 最后编辑:Dávid PásztorKang 更新时间:8/15/2023 访问量:29
在 Swift Array Extension 中组合元素和数组时出错 - 在 Xcode 中有效,但在 LeetCode 中无效
Error combining an element and an array in Swift Array Extension - Works in Xcode but not in LeetCode
问:
我一直在尝试在 Swift 的 Array 扩展中实现一个函数,该函数返回数组的所有排列。当我在 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 中实现了一个 Array 扩展来生成数组的所有排列。我采取的方法是递归分解问题,删除每个元素并获得其余元素的排列。然后,我会将删除的元素与这些排列组合在一起。
预期成果: 我希望我的 permute() 函数返回输入数组的所有可能排列。在 Xcode 中测试时,它提供了正确的结果,每个排列都是一个单独的数组。
实际结果: 当我将代码传输到 LeetCode 并尝试运行它时,我在 [tar] + ac 行上遇到了编译时错误。错误指出:
这很令人惊讶,因为 Xcode 中没有这样的问题。
答:
2赞
Dávid Pásztor
8/15/2023
#1
似乎 Leetcode 使用的是旧版本的 Swift,可能是 Swift 5.6,因为该错误在 Swiftfiddle 上也可以使用 5.6 编译器重现。
您只需要键入注释闭包的返回值,您的代码也可以使用 Swift 5.6 进行编译。看看这个 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
}
}
}
}
评论