Como posso lidar com esse erro sem criar variável adicional?
func reduceToZero(x:Int) -> Int {
while (x != 0) {
x = x-1 // ERROR: cannot assign to 'let' value 'x'
}
return x
}
Não quero criar variável adicional apenas para armazenar o valor de x. É possível fazer o que eu quero?
swift
syntax
immutability
mutability
Gabriel
fonte
fonte
Respostas:
Conforme declarado em outras respostas, a partir do Swift 3, coloque var antes que uma variável tenha sido descontinuada. Embora não seja indicado em outras respostas, é a capacidade de declarar um
inout
parâmetro. Pense: passando um ponteiro.Isso pode ser particularmente útil na recursão.
As
inout
diretrizes de declaração da Apple podem ser encontradas aqui .fonte
inout
A palavra-chave deve ser colocada entre o nome e o tipo de parâmetro da seguinte forma:func reduceToZero(x: inout Int)
na versão atual do Swift 3.Os parâmetros 'var' foram descontinuados e serão removidos no Swift 3. Portanto, a atribuição de um novo parâmetro parece a melhor maneira agora:
como mencionado aqui: os parâmetros 'var' foram descontinuados e serão removidos no Swift 3
fonte
x
no novovar x
? Ou a Swift está fazendo algo mais eficiente que isso?x
cabe no registro), praticamente não há custo. Sex
for uma matriz, estrutura ou objeto que foi alterado, uma cópia quase certamente precisa ser executada (a menos que o otimizador possa analisá-la em linha e alias).var
argumentos do que usar osinout
que podem ter efeitos colaterais indesejados, esp. se o var fosse um ponteiro.Para Swift 1 e 2 (para Swift 3, consulte a resposta de achi usando um parâmetro inout): O argumento de uma função no Swift é
let
por padrão; portanto, altere paravar
se você precisar alterar o valor, por exemplo,fonte
var
nos parâmetros é muito provável que desapareça nas versões mais recentes do Swift por github.com/apple/swift-evolution/blob/master/proposals/…Resposta Swift3 para passar o ponteiro do array mutável.
Função:
Chamada para funcionar:
fonte
No Swift, você apenas adiciona a
var
palavra - chave antes do nome da variável na declaração da função:Consulte a subseção "Parâmetros constantes e variáveis" no capítulo "Funções" do livro Swift (página 210 do iBook como é hoje).
fonte
Existem alguns casos em que não precisamos usar
inout
Podemos usar algo assim se você quiser que as alterações / escopo sejam apenas dentro da função:
fonte
Solução usando Swift5 com programação funcional ...
fonte