如何编写一个返回另一个输入输入参数的函数的函数?
我想编写返回makeIncrementor
函数的函数incrementor
。此incrementor
函数接受一个In-Out参数并将其递增一定量(它不返回任何内容)。这是我的代码:
func makeIncrementor(amount:Int) -> Int->Void {
func incrementor(inout variable:Int) -> Void {
variable += amount;
}
return incrementor;
}
var x = 1;
var inc = makeIncrementor(2);
inc(&x)
//x should now contain 3
但是,Xcode会出现以下错误:
<REPL>:9:12: error: 'Int' is not a subtype of 'inout Int'
return incrementor;
^
我做错了什么?
答案 0 :(得分:1)
要返回的函数的参数列表应该包含在parens中,并且应该在要修改的参数之前包含inout
,例如
(为了更清楚地看到它,将makeIncrementor
的返回值包装在parens中)
func makeIncrementor(amount:Int) -> ((inout Int) -> Void) {
func incrementor(inout variable:Int) -> Void {
variable += amount;
}
return incrementor;
}
答案 1 :(得分:1)
当您声明incrementor
函数返回类型(inout Int) -> ()
时,您将返回makeIncrementor
函数,其类型为Int -> ()
这种不匹配是导致错误和更改的原因
func makeIncrementor(amount:Int) -> Int-> ()
到
func makeIncrementor(amount : Int) -> (inout Int) -> ()
是正确的解决方法吗?但是,如果您当前尝试在游乐场中运行该代码,则会崩溃!
我已经在OSX和iOS Xcode项目中成功运行了以下代码,因此Xcode中的游乐场显然仍存在一些稳定性问题。
func makeIncrementor(amount : Int) -> (inout Int) -> () {
func incrementor(inout variable:Int) {
variable += amount
}
return incrementor
}
var incByTwo = makeIncrementor(2)
var incByThree = makeIncrementor(3)
var a = 5
println(a) // 5
incByTwo(&a)
println(a) // 7
incByThree(&a)
println(a) // 10
答案 2 :(得分:0)
如果您将返回类型更改为:
func makeIncrementor(amount: Int) -> inout Int -> Void {
// ...
}
然后错误就消失了,但我的Xcode崩溃了。