what programming method language functions enum closure apple according ios swift swift3 closures

ios - programming - swift method



Por qué las declaraciones de cierre de Apple pierden las etiquetas de los argumentos (3)

Los cierres están diseñados para ser versátiles. No tiene nombres de parámetros porque la función que cree para pasar podría ser muy diferente de la función a la que alguien más tiene derecho.

Recuerde, los nombres de los parámetros pertenecen a la función .

Para ilustrar, cuando creo una función, lo hago así:

func getUser(for name: String) -> User { // Stuff here... }

Agregué la etiqueta para que yo y otros supieran cómo usar correctamente la función.

Un parámetro de cierre no es una función, se pasa una función. La función que una persona escribe podría crear una hamburguesa de queso, mientras que otra persona podría escribir una que rote una vista de 180º y proceda a un nuevo controlador de visualización.

Con un ejemplo de la documentación de manzanas en UIView , hay un cierre final llamado completion . Como su nombre indica, esta función se activa cuando finaliza la animación. Ahora los documentos explican que el valor Bool le dice si la animación está completa o no, algo que no es obvio desde la función misma.

Si no está seguro de para qué se usa el parámetro (por ejemplo, arriba), mire los documentos.

Espero que esto responda a su pregunta.

Mientras leo el UIKit , la mayoría de las veces veo cierres (como un parámetro de función) con etiquetas de argumento faltantes como esta: func fooClosure(fooClosure: (Bool) -> Swift.Void)

En algunos casos, puedo adivinar lo que significa, en otros no puedo.

Ejemplo:

Eche un vistazo a uno de los UIActivityViewController de UIActivityViewController (como un alias tipo):

public typealias UIActivityViewControllerCompletionWithItemsHandler = (UIActivityType?, Bool, [Any]?, Error?) -> Swift.Void

¿Qué significa 3er tipo? Tengo que mirar la versión Objective-C del código para saber que estos son returnedItems .

Por qué no está implementado de esa manera: (tenga en cuenta la etiqueta activityItems )

public typealias UIActivityViewControllerCompletionWithItemsHandler = (UIActivityType?, Bool, _ activityItems: [Any]?, Error?) -> Swift.Void

Editar: - ¿Es solo un estado temporal (ya que Swift aún no está completamente integrado en estos marcos)? El código es menos legible sin etiquetas de argumento.


El problema es que esta es una tipología de firma de función generada por la máquina, y la máquina no está haciendo lo que le gustaría que hiciera. Considere la siguiente declaración de Objective-C:

typedef void (^MyCoolType)(NSString* __nullable name);

La interfaz generada Swift para eso es:

public typealias MyCoolType = (String?) -> Swift.Void

Como puede ver, el name fue eliminado; no está por ningún lado.

Nada le impide definir una tipografía de firma de función con etiquetas internas, en Swift. Esto es legal:

public typealias MyCoolType = (_ name:String?) -> Void

Pero no es así cómo se genera la interfaz generada desde Objective-C.


A partir de Swift 3, las palabras clave ya no forman parte del tipo de cierre, por lo que no aparecen (y no pueden) en cualquier lugar donde se espere un tipo, como en el type alias y declaraciones de func .

Vea la respuesta en esta publicación para más información.