Swift中嵌套函数的Inout参数

时间:2015-10-17 15:11:50

标签: swift

我正在练习Swift,我正在尝试实现自己的地图功能。嗯,与Haskell不一样,因为我希望它修改传递列表(使用inout参数进行实验)。可能吗?因为我写了这段代码:

func my_map<T>(f: T -> T) -> ([T] -> Void) {
    func go(inout l : [T]) -> Void {
        for i in 0..<l.count {
            l[i] = f(l[i])
        }
    }
    return go
}

var li = [1,5,3]
my_map({ $0 * 3 })(&li)
println(li)

它会出现以下错误(我完全不知道为什么):

  

错误:'[T]'不是'inout [T]'

的子类型      

返回

     

^

     

错误:意外尾随关闭

     

my_map2({$ 0 * 3})(&amp; li)

     

^

我正在使用http://swiftstub.com

有可能做我想做的事吗?

1 个答案:

答案 0 :(得分:1)

有可能。来自Xcode 7的错误消息更有帮助:

error: cannot convert return expression of type '(inout [T]) -> Void' to return type '([T]) -> Void'
    return go
           ^~

这意味着您只需要将inout添加到 返回类型为my_map的参数声明:

func my_map<T>(f: T -> T) -> ((inout [T]) -> Void) {
//                             ^^^^^
    func go(inout l : [T]) -> Void {
        for i in 0..<l.count {
            l[i] = f(l[i])
        }
    }
    return go
}

var li = [1,5,3]
my_map({ $0 * 3 })(&li)
print(li)
// [3, 15, 9]

您可以将它写得更紧凑:

func my_map<T>(f: T -> T) -> ((inout [T]) -> Void) {
    return { (inout l : [T]) in
        l = l.map(f)
    }
}