Swift:返回In-Out功能

时间:2014-06-20 23:00:19

标签: swift swift-playground

如何编写一个返回另一个输入输入参数的函数的函数?

我想编写返回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;
           ^

我做错了什么?

3 个答案:

答案 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崩溃了。