web-dev-qa-db-ja.com

Swiftメソッドパラメータを変更可能にしますか?

追加の変数を作成せずにこのエラーに対処するにはどうすればよいですか?

func reduceToZero(x:Int) -> Int {
    while (x != 0) {
        x = x-1            // ERROR: cannot assign to 'let' value 'x'
    }
    return x
}

Xの値を格納するためだけに追加の変数を作成したくありません。私がしたいことをすることさえ可能ですか?

99
Gabriel

他の回答で述べたように、Swift 3現在、変数が廃止される前にvarを配置しています。他の回答には記載されていませんが、inoutパラメーターを宣言する機能があります。考えてみてください:ポインタを渡す。

func reduceToZero(_ x: inout Int) {
    while (x != 0) {
        x = x-1     
    }
}

var a = 3
reduceToZero(&a)
print(a) // will print '0'

これは特に再帰で役立ちます。

Appleのinout宣言ガイドラインは こちら にあります。

159
achi

Swift 1および2の場合(Swift 3の場合、inoutパラメーターを使用したachiによる回答を参照):Swiftの関数の引数はletによってデフォルトなので、値を変更する必要がある場合はvarに変更します。つまり、

func reduceToZero(var x:Int) -> Int {
    while (x != 0) {
        x = x-1     
    }
    return x
}
44
LML

'var'パラメーターは非推奨であり、Swift 3で削除されます。したがって、新しいパラメーターに割り当てることは、今では最良の方法のようです。

func reduceToZero(x:Int) -> Int {
    var x = x
    while (x != 0) {
        x = x-1            
    }
    return x
}

ここで述べたように: 'var'パラメータは非推奨であり、Swift 3 で削除されます

37
GeRyCh

可変配列ポインターを渡すためのSwift3の答え。

関数:

func foo(array: inout Array<Int>) {
    array.append(1)
}

関数の呼び出し:

var a = Array<Int>()
foo(array:&a)
12
joshd

Swiftでは、関数宣言の変数名の前にvarキーワードを追加するだけです。

func reduceToZero(var x:Int) -> Int { // notice the "var" keyword
    while (x != 0) {
        x = x-1            
    }
    return x
}

Swiftブック(現在のiBookの210ページ)の 「関数」の章 のサブセクション「定数および変数パラメータ」を参照してください。

7
DK_

Swift3と関数型プログラミングを使用したソリューション...

func reduceToZeroFP(x:Int) -> Int {
    while (x > 0) {
        return reduceToZeroFP(x: x-1)
    }
    return x
}
0
Jules Burt

inoutを使用してはいけない場合があります

その変更/スコープを関数内のみにしたい場合は、次のようなものを使用できます。

func manipulateData(a: Int) -> Int {
    var a = a
    // ...
}
0
dheeru