Как мне справиться с этой ошибкой без создания дополнительной переменной?
func reduceToZero(x:Int) -> Int {
while (x != 0) {
x = x-1 // ERROR: cannot assign to 'let' value 'x'
}
return x
}
Я не хочу создавать дополнительную переменную только для хранения значения x. Можно ли вообще делать то, что я хочу?
swift
syntax
immutability
mutability
Габриель
источник
источник
Ответы:
Как указано в других ответах, с момента размещения в Swift 3 var до переменной устарел. Хотя в других ответах не указано, есть возможность объявить
inout
параметр. Подумайте: передача указателя.Это может быть особенно полезно при рекурсии.
С
inout
правилами декларации Apple можно ознакомиться здесь .источник
inout
ключевое слово должно быть помещено между именем параметра и типом параметра следующим образом:func reduceToZero(x: inout Int)
в текущей версии Swift 3.Параметры 'var' устарели и будут удалены в Swift 3. Таким образом, теперь назначение нового параметра кажется лучшим способом:
как упоминалось здесь: параметры 'var' устарели и будут удалены в Swift 3
источник
x
в новоеvar x
? Или Swift делает что-то более эффективное?x
помещается в регистр) практически нет затрат. Еслиx
это измененный массив, структура или объект, то почти наверняка необходимо выполнить копирование (если только оптимизатор не может проанализировать его в строке и присвоить ему псевдоним).var
аргументам, чем использование,inout
которое может иметь непредвиденные побочные эффекты, особенно. если var была указателем.Для Swift 1 и 2 (для Swift 3 см. Ответ от achi с использованием параметра inout): аргумент функции в Swift
let
по умолчанию, поэтому измените его на,var
если вам нужно изменить значение, т.е.источник
var
в параметрах, скорее всего, исчезнет в новых версиях Swift на github.com/apple/swift-evolution/blob/master/proposals/…Swift3 отвечает за передачу изменяемого указателя на массив.
Функция:
Вызов функции:
источник
В Swift вы просто добавляете
var
ключевое слово перед именем переменной в объявлении функции:Обратитесь к подразделу «Постоянные и переменные параметры» в главе «Функции» книги Swift (страница 210 в iBook в его нынешнем виде).
источник
В некоторых случаях нам не нужно использовать
inout
Мы можем использовать что-то вроде этого, если вы хотите, чтобы эти изменения / область действия были только внутри функции:
источник
Решение с использованием Swift5 с функциональным программированием ...
источник