Xcode 8: los types de function no pueden tener label de argumento que rompa mi compilation

Parece que, por alguna razón, Swift ha optado por hacer que la encoding sea less legible forzando a los usuarios a eliminar las tags de parameters del manejador de finalización. He leído la discusión Swift y aún pienso que es un error. Al less podrían haberlo hecho opcional.

Cuando construyas usando Xcode 8, ¿hay alguna forma de obligar al comstackdor a utilizar Swift 2.3, así que ya no recibo estos errores? He actualizado la opción de usar Swift henetworkingado (en la configuration de compilation) soporte heredado en xcode pero todavía parezco get este error:

Los types de function no pueden tener la label de argumento 'isloggedIn'; use '_' en su lugar

error Xcode 8

¿Cómo puedo mantener mis tags en mis controlleres de finalización?

Los diseñadores Swift decidieron prohibir las tags de arguments para los types de funciones.

El razonamiento se explica aquí: https://github.com/apple/swift-evolution/blob/master/proposals/0111-remove-arg-label-type-significance.md

Esta es una opción frustrante y cuestionable, ya que prohibir las tags de arguments hace que sea mucho más fácil invocar incorrectamente cierres, lo que parece más importante que simplificar el sistema de tipo de lenguaje.

La usabilidad debería adelantarse a la ideología.

Una solución a considerar. No puedes hacer:

func doStuff(completion: (foo: Int, bar: String) -> Void) { ... completion(foo: 0, bar: "") } 

… pero puedes hacerlo:

 func doStuff(completion: ((foo: Int, bar: String)) -> Void) { ... completion((foo: 0, bar: "")) } 

es decir, tiene un único argumento sin nombre para su cierre que es una tupla, en este caso (foo: Int, bar: String) .

Es feo a su manera, pero al less retiene las tags de los arguments.

Descargo de responsabilidad: no he pensado en las implicaciones de captura o performance de este enfoque.

Sobre la base de la información anterior, parece que la única manera de solucionar esto realmente y asegurar que su performance sea plantear una propuesta para hacer que las tags de argumento sean opcionales con vistas a:

  1. mejorando la velocidad de desarrollo (sin tags de argumento, nos obliga a desplazarnos hasta la parte superior del método cada vez que colocamos el manejador de finalización.
  2. Reducir errores: (Ya he tenido varios errores causados ​​debido a inputs de manejador de finalización incorrectas, especialmente con aquellos que esperan valores booleans)
  3. Haga que el código sea más legible en todos los miembros del equipo. No todo el mundo tiene un solo miembro del equipo y, por lo tanto, es fácil de captar el código de otras personas.
  4. Por último, una buena práctica de progtwigción significa que la solución debe parecerse mucho al artículo real que se está desarrollando. completionhandler: (newvalues, nil) parece less al elemento que se gestiona que el manejador de completionhandler(results: newValue, error:nil)

Me encantaría que las personas que lo lean compartan sus comentarios / comentarios sobre esto a continuación antes de que lo envíe, así puedo mostrar que hay otros que lo apoyan.

Edit: He enviado el campo aquí: https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20161010/028083.html que parece haber sido acordado. Parece que va a suceder, sin embargo, la discusión es si esto se presenta como una mejora de Swift 4 (altamente probable)

Tienes que usar _ para hacer que tus parameters sean anónimos, y eso es lamentable. En lugar de virar _ a cada parámetro y luego llamar ciegamente a su function, sugeriría hacer un object contenedor.

Dado que perder parameters con nombre para los types de funciones introduce más riesgo de que llame a la function con los valores incorrectos, sugiero que envuelva los parameters en una estructura y que sea el único parámetro para su function.

De esta manera, los campos de su estructura se denominan y solo hay un tipo de valor para pasar a su function. Es más engorroso que si pudiéramos nombrar los parameters de la function, pero no podemos. Al less así estarás más seguro y te sentirás less sucio.

 struct LineNoteCellState { var lineNoteText: String? var printOnInvoice = false var printOnLabel = false } 

Aquí hay un ejemplo de cómo se usa:

 cell.configure(editCallback: { (_ state: LineNoteCellState) in self.lineNoteText = state.lineNoteText self.printOnInvoice = state.printOnInvoice self.printOnLabel = state.printOnLabel }) 

Semi-solución, tenga en count el _

 completion: (_ success: Bool) -> Void