在嵌套函数中使用闭包如何逃逸?

How can a closure escape when it's used in a nested function?

我正在研究递归定义的数据结构。归结为数组,这就是我为 map:

所做的
func map<T, U>(_ arr: [T], _ mut: T -> U) -> [U] {
    func recMap(_ i : Int) -> [U] {
        if i >= arr.count {
            return []
        } else {
            return [mut(arr[i])] + recMap(i+1)
        }
    }

    if arr.count > 0 {
        return recMap(0)
    } else {
        return []
    }
}

这让我印象深刻,因为它很好地使用了嵌套函数:遍历代码不会逃脱它唯一需要的范围。 (让我们假设这里确实是这种情况。)

然而,Swift 抱怨:

Declaration closing over non-escaping parameter 'mut' may allow it to escape.

当然,recMap可能会做一些奇怪的事情,但事实并非如此;是编译器无法解决的问题吗?

加深我困惑的是这段代码有效:

private func recMap<T, U>(_ arr: [T], _ i : Int, _ mut: (T) -> U) -> [U] {
    if i >= arr.count {
        return []
    } else {
        return [mut(arr[i])] + recMap(arr, i+1, mut)
    }
}

func map<T, U>(_ arr: [T], _ mut: (T) -> U) -> [U] {
    if arr.count > 0 {
        return recMap(arr, 0, mut)
    } else {
        return []
    }
}

当然,mut现在可以用同样的方法逃跑了?

我错过了什么?有没有办法让第一个版本工作?

这似乎是由于分析转义行为的组件存在缺陷;这显然有点过于防御了。

参见 this bug report。当前状态:打开,未分配。