Параметры метода 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
    // ...
}