tutorial the programming para linea language for examples descargar xcode swift xcode7 swift3

xcode - the - Los parámetros ''var'' están en desuso y se eliminarán en Swift 3



xcode en linea (9)

Muy bien, solo actualizo Xcode a 7.3 y ahora recibo esta advertencia:

Los parámetros ''var'' están en desuso y se eliminarán en Swift 3

Cómo solucionar esto cuando necesito usar 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() }


¿Has intentado asignar a una nueva var

public func getQuestionList(language: String) -> NSArray { var lang = language if self.data.count > 0 { if (lang.isEmpty) { lang = "NL" } return self.data.objectForKey("questionList" + lang) as! NSArray } return NSArray() }


Aquí hay otra idea. Mi caso de uso fue pasar una matriz de cadenas para agregarla, para lo cual la matriz debe pasarse de forma mutable. Tampoco quería tener un estado en mi clase para esto. Entonces hice una clase que contiene la matriz y la pasé. Dependiendo de su caso de uso, puede parecer una tontería tener una clase que contenga solo esa variable.

private class StringBuilder { var buffer: [String] = [] func append(_ str: String) { buffer.append(str) } func toString() -> String { return buffer.joined() } }

Solo uso los métodos append y append 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:

private func writeMap(map: LevelMap, url: URL) -> Bool { let buffer = StringBuilder() if !writeHeader(map: map, buffer: buffer) { return false } if !writeFloors(map: map, buffer: buffer) { return false } let content = buffer.toString() do { try content.write(to: url, atomically: true, encoding: .utf8) return true } catch {} return false } private func writeHeader(map: LevelMap, buffer: StringBuilder) -> Bool { buffer.append("something here .../n") return true }


Creo que las respuestas de @Harris y @garanda son el mejor enfoque.

De todos modos, en su caso, no hay necesidad de una var, puede hacer:

public func getQuestionList(language: String) -> NSArray { if self.data.count > 0 { return self.data.objectForKey("questionList" + (language.isEmpty ? "NL" : language)) as! NSArray } return NSArray() }


La discusión sobre la eliminación de Var de un parámetro de función está completamente documentada en esta presentación en GitHub: github.com/apple/swift-evolution/blob/master/proposals/…

En ese documento, encontrará que las personas a menudo confunden los parámetros var con los parámetros inout . Un parámetro var simplemente significa que el parámetro es mutable dentro del contexto de la función, mientras que con un parámetro inout el valor del parámetro en el punto de retorno se copiará de la función al contexto del llamante.

La forma correcta de resolver este problema es eliminar var del parámetro e introducir una variable var local. En la parte superior de la rutina, copie el valor del parámetro en esa variable.


Mucha gente sugiere un parámetro inout , pero eso no es para lo que están diseñados. Además, no permite llamar a la función con una constante let , ni con un literal de cadena. ¿Por qué no agrega simplemente el valor predeterminado a la firma de la función?

public func getQuestionList(language language: String = "NL") -> NSArray { if data.count > 0 { return data.objectForKey("questionList" + language) as! NSArray } else { return NSArray() } }

Solo asegúrese de no llamar a getQuestionList con la cadena vacía en caso de que desee el idioma predeterminado, pero simplemente getQuestionList el parámetro:

let list = getQuestionList() // uses the default "NL" language


Simplemente agregue esta línea al comienzo de la función:

var language = language

y el resto de su código puede permanecer sin cambios, así:

public func getQuestionList(language: String) -> NSArray { var language = language if self.data.count > 0 { if (language.isEmpty) { language = "NL" } return self.data.objectForKey("questionList" + language) as! NSArray } return NSArray() }


https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Functions.html

Parámetros de entrada y salida

Los parámetros de la función son constantes por defecto. Intentar cambiar el valor de un parámetro de función 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 y salida.

Usted escribe un parámetro de entrada colocando la palabra clave de entrada justo antes del tipo de parámetro. Un parámetro de entrada y salida tiene un valor que se pasa a la función, es modificado por la función y se vuelve a salir de la función para reemplazar el valor original. Para una discusión detallada del comportamiento de los parámetros de entrada y salida y las optimizaciones del compilador asociadas, vea Parámetros de entrada-salida.

Solo puede pasar una variable como argumento para un parámetro de entrada y salida. No puede pasar una constante o un valor literal como argumento, porque las constantes y literales no pueden modificarse. Coloca un ampersand (&) directamente antes del nombre de una variable cuando lo pasa como argumento a un parámetro in-out, para indicar que la función puede modificarlo.

NOTA

Los parámetros de entrada no pueden tener valores predeterminados y los parámetros variables no pueden marcarse como entrada.

Aquí hay un ejemplo de una función llamada swapTwoInts ( : :), que tiene dos parámetros enteros de entrada y salida llamados a y b:

func swapTwoInts(_ a: inout Int, _ b: inout Int) { let temporaryA = a a = b b = temporaryA }

La función swapTwoInts ( : :) simplemente intercambia el valor de b por a, y el valor de a por b. La función realiza este intercambio almacenando el valor de a en una constante temporal llamada temporaria A, asignando el valor de b a a, y luego asignando temporalmente A 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 de un signo y cuando se pasan a la función swapTwoInts ( : :):

var someInt = 3 var anotherInt = 107 swapTwoInts(&someInt, &anotherInt) print("someInt is now /(someInt), and anotherInt is now /(anotherInt)") // Prints "someInt is now 107, and anotherInt is now 3"

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 o devuelve un valor, pero aún modifica los valores de someInt y anotherInt. Los parámetros de entrada y salida son una forma alternativa para que una función tenga un efecto fuera del alcance de su cuerpo de función.


Swift 4

public func getQuestionList(language: inout String) -> NSArray { if self.data.count > 0 { if (language.isEmpty) { language = "NL" } return self.data.objectForKey("questionList" + language) as! NSArray } return NSArray() } getQuestionList(language: &someString)

En algunos casos, como he experimentado (con configuraciones más complejas que involucran matrices), crear una nueva propiedad dentro del método y mutar esa propiedad puede no funcionar siempre. Sin mencionar que está abarrotando el método en lugar de simplemente agregarlo a un parámetro y & a su argumento, que es para lo que se creó esta sintaxis.


public func getQuestionList(language: inout String) -> NSArray { if self.data.count > 0 { if (language.isEmpty) { language = "NL" } return self.data.objectForKey("questionList" + language) as! NSArray } return NSArray()

}