Параметры метода Swift make mutable?
Как я могу справиться с этой ошибкой без создания дополнительной переменной?
func reduceToZero(x:Int) -> Int {
while (x != 0) {
x = x-1 // ERROR: cannot assign to 'let' value 'x'
}
return x
}
Я не хочу создавать дополнительную переменную, чтобы сохранить значение x. Возможно ли сделать то, что я хочу?
Ответы
Ответ 1
Как указывалось в других ответах, начиная с 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 можно найти здесь.
Ответ 2
Для Swift 1 и 2 (для Swift 3 см. ответ от achi с использованием параметра inout): аргумент функции в Swift равен let
по умолчанию, поэтому измените его на var
, если вам нужно изменить значение
то есть,
func reduceToZero(var x:Int) -> Int {
while (x != 0) {
x = x-1
}
return x
}
Ответ 3
Параметры 'var' устарели и будут удалены в Swift 3.
Поэтому присвоение новому параметру выглядит как лучший способ:
func reduceToZero(x:Int) -> Int {
var x = x
while (x != 0) {
x = x-1
}
return x
}
как указано здесь: Параметры 'var' устарели и будут удалены в Swift 3
Ответ 4
Swift3 ответ для передачи измененного указателя на массив.
Функции:
func foo(array: inout Array<Int>) {
array.append(1)
}
Вызов функции:
var a = Array<Int>()
foo(array:&a)
Ответ 5
В Swift вы просто добавляете ключевое слово var
перед именем переменной в объявлении функции:
func reduceToZero(var x:Int) -> Int { // notice the "var" keyword
while (x != 0) {
x = x-1
}
return x
}
Обратитесь к подразделу "Константные и переменные параметры" в главе Функции книги Swift (страница 210 iBook, как и сегодня).
Ответ 6
Решение с использованием Swift3 с функциональным программированием...
func reduceToZeroFP(x:Int) -> Int {
while (x > 0) {
return reduceToZeroFP(x: x-1)
}
return x
}
Ответ 7
В некоторых случаях мы не хотим использовать inout
Мы можем использовать что-то вроде этого, если вы хотите, чтобы изменения/области были только внутри функции:
func manipulateData(a: Int) -> Int {
var a = a
// ...
}