Свифт способ сделать изменяемый параметр?


Как я могу справиться с этой ошибкой без создания дополнительной переменной?

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

Я не хочу создавать дополнительную переменную, чтобы хранить значение x. Можно ли вообще делать то, что я хочу?

6 77

6 ответов:

как указано в других ответах, по состоянию на 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'

Это может быть особенно полезно в рекурсии.

руководство по объявлению inout от Apple можно найти здесь.

для Swift 1 и 2 (для Swift 3 см. ответ achi с использованием параметра inout): аргумент функции в 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
}

Как уже упоминалось здесь: 'ВАР' являются устаревшими и будут удалены в срочном порядке в 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 (страница 210 iBook, как это сегодня).

решение с использованием Swift3 с функциональным программированием...

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