2

in-out パラメーターを受け取る別の関数を返す関数を作成するにはどうすればよいですか?

makeIncrementor関数を返す関数を書きたいincrementor。このincrementor関数は、1 つの 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;
           ^

私は何を間違っていますか?

4

3 に答える 3

1

関数が型を返すと宣言しているときincrementorに型を持つ関数を返しています(inout Int) -> ()makeIncrementorInt -> ()

この不一致は、エラーと変更の理由です

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 
于 2014-09-18T14:09:50.977 に答える
0

戻り値の型を次のように変更した場合:

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

その後、エラーは消えますが、Xcode がクラッシュします。

于 2014-06-20T23:07:52.037 に答える