Muy bien, acabo de actualizar Xcode a 7.3 y ahora recibo esta advertencia:
Los parámetros 'var' están obsoletos y se eliminarán en Swift 3
Cómo solucionar esto cuando necesito usar la var en esta función:
public func getQuestionList(var language: String) -> NSArray {
if self.data.count > 0 {
if (language.isEmpty) {
language = "NL"
}
return self.data.objectForKey("questionList" + language) as! NSArray
}
return NSArray()
}
public func getQuestionList(inout language: String) -> NSArray
getQuestion
tener efectos secundarios.func foo(_ bar: int) { /*use bar*/ bar+=1; foo(bar); }
. Esto es imposible sin var params. Necesita crear una var separada dentro de la función y copiar el valor, o marcar el parámetro como inout. El primero es lento, el segundo provoca un comportamiento indefinido. Muchos algoritmos usan la recursividad como esta.Respuestas:
¿Ha intentado asignar a una nueva var
fuente
La discusión sobre la eliminación de Var de un parámetro de función está completamente documentada en este envío en GitHub: Eliminar parámetros de Var
En ese documento encontrará que las personas a menudo confunden
var
parámetros coninout
parámetros. Unvar
parámetro simplemente significa que el parámetro es mutable dentro del contexto de la función, mientras que con uninout
parámetro el valor del parámetro en el punto de retorno se copiará fuera de la función y en el contexto de la persona que llama.La forma correcta de resolver este problema es eliminar
var
del parámetro e introducir unavar
variable local . En la parte superior de la rutina, copie el valor del parámetro en esa variable.fuente
Simplemente agregue esta línea al comienzo de la función:
y el resto de su código puede permanecer sin cambios, así:
fuente
Mucha gente está sugiriendo un
inout
parámetro, pero en realidad no está diseñado para eso. Además, no permite llamar a la función con unalet
constante, ni con un literal de cadena. ¿Por qué no agrega simplemente el valor predeterminado a la firma de la función?Solo asegúrese de no llamar
getQuestionList
con la cadena vacía en caso de que desee el idioma predeterminado, pero simplemente omita el parámetro:fuente
Rápido 4
En algunos casos, como he experimentado (con configuraciones más complejas que involucran matrices), es posible que la creación de una nueva propiedad dentro del método y la mutación de esa propiedad no siempre funcione. Sin mencionar que está saturando el método en lugar de simplemente agregar
inout
un parámetro y&
su argumento, que es para lo que se creó esta sintaxis.fuente
}
fuente
Creo que las respuestas de @Harris y @garanda son el mejor enfoque.
De todos modos, en su caso, no es necesaria una var, puede hacer:
fuente
https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Functions.html
Parámetros de entrada y salida
Los parámetros de función son constantes por defecto. Intentar cambiar el valor de un parámetro de función desde dentro del cuerpo de esa función da como resultado un error en tiempo de compilación. Esto significa que no puede cambiar el valor de un parámetro por error. Si desea que una función modifique el valor de un parámetro y desea que esos cambios persistan después de que finalice la llamada a la función, defina ese parámetro como un parámetro de entrada-salida.
Escribe un parámetro in-out colocando la palabra clave inout justo antes del tipo de parámetro. Un parámetro de entrada-salida tiene un valor que se pasa a la función, es modificado por la función y se devuelve fuera de la función para reemplazar el valor original. Para obtener una descripción detallada del comportamiento de los parámetros de entrada y salida y las optimizaciones del compilador asociadas, consulte Parámetros de entrada y salida.
Solo puede pasar una variable como argumento para un parámetro de entrada-salida. No puede pasar una constante o un valor literal como argumento, porque las constantes y los literales no se pueden modificar. Coloca un ampersand (&) directamente antes del nombre de una variable cuando lo pasa como un argumento a un parámetro de entrada-salida, para indicar que la función puede modificarlo.
NOTA
Los parámetros de entrada y salida no pueden tener valores predeterminados y los parámetros variables no se pueden marcar como inout.
Aquí hay un ejemplo de una función llamada swapTwoInts ( : :), que tiene dos parámetros enteros de entrada y salida llamados ayb:
La función swapTwoInts ( : :) simplemente intercambia el valor de b en a, y el valor de a en b. La función realiza este intercambio almacenando el valor de a en una constante temporal llamada temporalA, asignando el valor de b a a, y luego asignando temporalA a b.
Puede llamar a la función swapTwoInts ( : :) con dos variables de tipo Int para intercambiar sus valores. Tenga en cuenta que los nombres de someInt y anotherInt tienen el prefijo ampersand cuando se pasan a la función swapTwoInts ( : :):
El ejemplo anterior muestra que los valores originales de someInt y anotherInt son modificados por la función swapTwoInts ( : :), aunque originalmente se definieron fuera de la función.
NOTA
Los parámetros de entrada y salida no son lo mismo que devolver un valor de una función. El ejemplo de swapTwoInts anterior no define un tipo de retorno ni devuelve un valor, pero aún modifica los valores de someInt y anotherInt. Los parámetros de entrada y salida son una forma alternativa de que una función tenga un efecto fuera del alcance de su cuerpo de función.
fuente
Aquí hay otra idea. Mi caso de uso fue pasar una matriz de cadenas para agregarla, para lo cual la matriz debe pasarse de manera mutante. Tampoco quería tener un estado en mi clase para esto. Así que hice una clase que contiene la matriz y la paso. Dependiendo de su caso de uso, puede parecer una tontería tener una clase que contenga solo esa variable.
Yo solo uso
append
joined
métodos y en la matriz, por lo que fue fácil cambiar el tipo con un mínimo de otros cambios en mi código.Algunos ejemplos de uso:
fuente