【发布时间】:2017-04-30 23:22:40
【问题描述】:
我正在使用递归定义的数据结构。将其归结为数组,这就是我为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 []
}
}
这让我觉得很好地使用了嵌套函数:遍历代码并没有逃脱它需要的唯一范围。 (让我们假设这里的情况确实如此。)
然而,斯威夫特抱怨:
关闭非转义参数“mut”的声明可能允许它转义。
当然,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 现在可以以同样的方式逃跑了吗?
我错过了什么?有没有办法让第一个版本工作?
【问题讨论】:
-
可能只是编译器中的一个错误。我会打开一个错误报告。嵌套函数并不总是得到应有的支持。
-
@RobNapier 很高兴知道这可能不是我!好像已经是reported了。
标签: swift scope swift3 closures nested-function