追加の変数を作成せずにこのエラーに対処するにはどうすればよいですか?
func reduceToZero(x:Int) -> Int {
while (x != 0) {
x = x-1 // ERROR: cannot assign to 'let' value 'x'
}
return x
}
Xの値を格納するためだけに追加の変数を作成したくありません。私がしたいことをすることさえ可能ですか?
他の回答で述べたように、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宣言ガイドラインは こちら にあります。
Swift 1および2の場合(Swift 3の場合、inoutパラメーターを使用したachiによる回答を参照):Swiftの関数の引数はlet
によってデフォルトなので、値を変更する必要がある場合はvar
に変更します。つまり、
func reduceToZero(var x:Int) -> Int {
while (x != 0) {
x = x-1
}
return x
}
'var'パラメーターは非推奨であり、Swift 3で削除されます。したがって、新しいパラメーターに割り当てることは、今では最良の方法のようです。
func reduceToZero(x:Int) -> Int {
var x = x
while (x != 0) {
x = x-1
}
return x
}
ここで述べたように: 'var'パラメータは非推奨であり、Swift 3 で削除されます
可変配列ポインターを渡すためのSwift3の答え。
関数:
func foo(array: inout Array<Int>) {
array.append(1)
}
関数の呼び出し:
var a = Array<Int>()
foo(array:&a)
Swiftでは、関数宣言の変数名の前にvar
キーワードを追加するだけです。
func reduceToZero(var x:Int) -> Int { // notice the "var" keyword
while (x != 0) {
x = x-1
}
return x
}
Swiftブック(現在のiBookの210ページ)の 「関数」の章 のサブセクション「定数および変数パラメータ」を参照してください。
Swift3と関数型プログラミングを使用したソリューション...
func reduceToZeroFP(x:Int) -> Int {
while (x > 0) {
return reduceToZeroFP(x: x-1)
}
return x
}
inout
を使用してはいけない場合があります
その変更/スコープを関数内のみにしたい場合は、次のようなものを使用できます。
func manipulateData(a: Int) -> Int {
var a = a
// ...
}