¿Cómo puedo lidiar con este error sin crear una variable adicional?
func reduceToZero(x:Int) -> Int {
while (x != 0) {
x = x-1 // ERROR: cannot assign to 'let' value 'x'
}
return x
}
No quiero crear una variable adicional solo para almacenar el valor de x. ¿Es posible hacer lo que quiero?
swift
syntax
immutability
mutability
Gabriel
fuente
fuente
Respuestas:
Como se indicó en otras respuestas, a partir de Swift 3 colocando var antes de que una variable haya quedado en desuso. Aunque no se indica en otras respuestas, es la capacidad de declarar un
inout
parámetro. Piensa: pasar un puntero.Esto puede ser particularmente útil en la recursividad.
Las
inout
pautas de declaración de Apple se pueden encontrar aquí .fuente
inout
La palabra clave debe colocarse entre el nombre del parámetro y el tipo de parámetro de esta manera:func reduceToZero(x: inout Int)
en la versión actual de Swift 3.Los parámetros 'var' están en desuso y se eliminarán en Swift 3. Por lo tanto, asignar a un nuevo parámetro parece ser la mejor manera ahora:
como se menciona aquí: los parámetros 'var' están en desuso y se eliminarán en Swift 3
fuente
x
en el nuevovar x
? ¿O Swift está haciendo algo más eficiente que eso?x
cabe en el registro) prácticamente no hay costo. Si sex
trata de una matriz, estructura u objeto que está mutado, es casi seguro que se debe realizar una copia (a menos que el optimizador pueda analizarlo en línea y alias).var
args que el usoinout
que puede tener efectos secundarios no deseados, especialmente. si la var fuera un puntero.Para Swift 1 y 2 (para Swift 3, vea la respuesta de achi usando un parámetro inout): El argumento de una función en Swift es
let
por defecto, así que cámbielo avar
si necesita alterar el valor, es decir,fuente
var
es muy probable que los parámetros desaparezcan en las nuevas versiones de Swift según github.com/apple/swift-evolution/blob/master/proposals/…Respuesta Swift3 para pasar el puntero de matriz mutable.
Función:
Llamado a la función:
fuente
En Swift, simplemente agrega la
var
palabra clave antes del nombre de la variable en la declaración de función:Consulte la subsección "Parámetros constantes y variables" en el capítulo "Funciones" del libro Swift (página 210 del iBook tal como está hoy).
fuente
Hay algunos casos en los que no necesitamos usar
inout
Podemos usar algo como esto si desea que los cambios / alcance estén solo dentro de la función:
fuente
Solución usando Swift5 con programación funcional ...
fuente