Cierres syntax abreviada en Swift 3

¿Cuál es la diferencia desde la perspectiva del comstackdor entre las expresiones 1 y 2 (ver el fragment de código a continuación)? Si desde Swift 3 ya no es posible pasar múltiples parameters a las funciones en forma de una tupla, entonces, ¿cómo sigue funcionando la primera expresión?

func f(_ x: Int, _ y: Int) -> Int { return x + y } // expression 1: compiles [(1, 2)].map(f) // expression 2: doesn't compile "Passing 2 arguments to a callee as a single tuple value has been removed in Swift 3" [(1, 2)].map { (t: (Int, Int)) -> Int in return f(t) } 

El razonamiento se explica en la propuesta que lo eliminó . Creó problemas sutiles en el segundo caso, pero no en el primero. Y, como en el caso de la mayoría "¿por qué el comstackdor no arroja un error aquí?", La respuesta es "porque no lo previene". No siempre significa que haya una intención profunda en el trabajo. A veces funciona porque no se ha impedido que funcione.

Pero también es cierto que este no es un caso especial en el primer ejemplo. Esto también funciona con tags:

 func f(x: Int, y: Int) -> Int { ... } [(1, 2)].map(f) 

En el segundo ejemplo, eso no solía funcionar porque se topa con el hecho de que las tags de tuplas no son parte del tipo, por lo que no hay actualmente una forma de expresslo correctamente (este es uno de los problemas sutiles) . Ver:

  • Eliminar el significado del sistema de tipo de las tags de los arguments de funciones.
  • Nombres y tags de parameters de cierre

Es importante tener en count que esta es una característica común en los lenguajes funcionales, pero Swift no es un lenguaje funcional, no pretende serlo, y ha eliminado varias funciones funcionales existentes en Swift 3 para hacer que el lenguaje sea más coherente (lo más famoso , syntax de curry, que también luchó realmente contra cómo Swift pretende trabajar). La forma en que ha definido f() es extremadamente similar a Swift, ambos son una function de nivel superior (que Swift evita) y al no nombrar sus parameters. Swift permite tales cosas, pero no las atiende. El equipo de Swift está ansioso por escuchar ejemplos en los que esta syntax sea útil, y que mapee a los problemas comunes que los desarrolladores de Swift probablemente encuentren (han indicado que explorarán la posibilidad de volver a agregar la característica más completamente si se presentaron tales ejemplos). Vea la propuesta evo para el hilo para discutir esto si tiene ejemplos.

En general, las tuplas en Swift son salsa débil. No están a la altura de ser verdaderas "estructuras anónimas" como cabría esperar, y son apenas types de primera class (por ejemplo, no puede adjuntar extensiones a ellos). Hay varias propuestas abiertas para mejorar las tuplas, pero en Swift 3, no son realmente una herramienta muy poderosa más allá de los usos muy simples.

    Intereting Posts