我正在练习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
有可能做我想做的事吗?
答案 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)
}
}