2014-06-20 35 views
2

如何编写一个返回另一个带有输入参数的函数的函数?Swift:返回一个输入输出函数

我想编写函数makeIncrementor,它返回一个incrementor函数。这个incrementor函数接受一个I​​n-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

我假设你的意思是'var inc = makeIncrementor(2)'? –

+0

哎呀,是错别字 – jburns20

回答

0

如果更改返回类型:

func makeIncrementor(amount: Int) -> inout Int -> Void { 
    // ... 
} 

然后错误消失,但我的Xcode崩溃。

+0

同样的事情发生在我身上... – jburns20

+0

我试过了,Xcode崩溃了... –

1

正在返回的函数的参数列表应该包装在parens中,并且应该在要修改的参数之前包括inout,例如,

(以看得更清楚,在括号包裹的makeIncrementor返回值也一样)

func makeIncrementor(amount:Int) -> ((inout Int) -> Void) { 
    func incrementor(inout variable:Int) -> Void { 
     variable += amount; 
    } 
    return incrementor; 
} 
+0

现在我收到以下错误: 'Playground execution failed:error:error:Could not lookup symbols: __TMdRSi' – jburns20

+0

这可能只是Xcode中的一个错误。 – jburns20

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