Las extensiones son una de las mejores características de Swift. Las extensiones le permiten agregar comportamiento a las clases existentes, incluidas las clases en Cocoa Touch Framework. Apple no puede agregar todas las funciones que desea a sus clases de marco, ¡pero le han proporcionado una herramienta que le permite hacerlo usted mismo! En este artículo, aprenderá los usos prácticos de las extensiones Swift que puede utilizar de inmediato en sus proyectos de iOS.
Índice de contenido
Extensiones Swift
Las extensiones de Swift le permiten extender clases, estructuras y enumeraciones sin crear una subclase. Es mejor crear una extensión para agregar funcionalidad a una clase Cocoa Touch Framework que crear una subclase, porque le permite usar la clase Cocoa Touch estándar en toda su aplicación. Por ejemplo, si agrega una extensión al NSURL clase, todavía puedes usar NSURL a lo largo de su aplicación. No es necesario que recuerde utilizar una subclase personalizada en algunos lugares y NSURL en otros.
Puede agregar estos elementos a un tipo usando extensiones:
- Métodos de instancia y tipo
- Instancia calculada y propiedades de tipo calculado
- Inicializadores
- Subíndices
- Conformidad con un protocolo
Aquí está la sintaxis básica para declarar una extensión en Swift:
Crear extensiones personalizadas
Para ver cómo funcionan las extensiones Swift, agreguemos un nuevo método a la clase String de Swift.
De forma predeterminada, String no tiene un método que le diga el número de veces que una cadena ocurre en otra cadena. Por ejemplo, es posible que desee saber cuántas comas hay en una cadena. Dado que String no tiene este método, puede agregarlo usando una extensión.
Ya he creado una extensión para ti. Descargar el ExtensionesDemo proyecto de muestra en este enlace para que puedas echar un vistazo.
- Después de descargar el ExtensionesDemo proyecto, ábralo en Xcode.
- Selecciona el StringExtensions.swift en el Navegador de proyectos para ver la siguiente declaración de extensión:
La palabra clave de extensión va seguida del nombre de la clase que se está ampliando; en este caso, Cuerda. La extensión declara un ocurrenciasOfString método que acepta un Cuerda parámetro llamado una cuerda. Esta es la cadena que está buscando. El valor de retorno es un En t que contiene el número de veces una cuerda se encuentra en la cadena que está probando. Dentro de este método, self se refiere al objeto de cadena que está buscando.
- Veamos cómo funciona esta extensión en tiempo de ejecución. En el Navegador de proyectos, expanda el ExtensionsDemoTests.swift archivo. Este archivo contiene el testExtension método:
- los StringExtensions.swift La clase no está incluida en el objetivo del proyecto de prueba unitaria. Para verificar esto, escriba las letras entonces después de la declaración constante:
los ocurrenciasOfString El método no aparece en Finalización de código porque la extensión no se ha incluido en el destino de la prueba unitaria. Cambiemos eso.
- Seleccione StringExtensions.swift en el Navegador de proyectos. Vaya al Inspector de archivos en el lado derecho de la ventana de Xcode, y debajo Membresía objetivo, Selecciona el ExtensionesDemoTests casilla de verificación (Figura 1).
Figura 1 – Seleccione el ExtensionDemoTests objetivo. |
- Selecciona el ExtensionDemoTests.swift archivo en el Navegador de proyectos. Inserte el código entonces y el ocurrenciasOfString El método aparece en Completado de código (Figura 2).
Figura 2 – ¡La extensión String aparece en Code Completion! |
- Agregue el siguiente código al testExtension método:
Este código verifica el número de veces que aparece “el” en la cadena. ¡Debería aparecer dos veces!
- Establezca un punto de interrupción haciendo clic en el margen a la izquierda de la segunda línea de código (figura 3).
Figura 3: establezca un punto de interrupción en la segunda línea de código. |
- Para ejecutar este método, vaya al Navegador de pruebas haciendo clic en el quinto botón de la izquierda en la barra de herramientas del Navegador. Luego haga clic en la flecha a la derecha del ExtensionDemoTests nodoFigura 4).
Figura 4 – Ejecute la prueba unitaria. |
- Cuando llegue al punto de interrupción, haga clic en el Dar un paso en la barra de herramientas Depurar y el contar La variable se establece en 2 en la Vista de variables (Figura 5).
Figura 5 – Se han encontrado dos ocurrencias. |
- Haga clic en el botón Continuar en la barra de herramientas Depurar y Xcode indica el testExtension ha pasado el método.
Agregar propiedades calculadas
Las extensiones de Swift pueden agregar propiedades de tipo e instancia computadas, pero no pueden agregar propiedades almacenadas u observadores de propiedades a propiedades existentes.
Veamos una extensión que agrega una propiedad de instancia calculada al UIImage Clase Cocoa Touch.
- En Xcode, seleccione Archivo> Abrir y navegue hasta la carpeta donde descargó el código de muestra de esta publicación. Profundizar en el ExtensionesDemo proyecto, seleccione el Extensions.playground archivo y haga clic en Abierto.
- El patio de recreo contiene la siguiente extensión del UIImage clase:
Esta extensión contiene una única propiedad llamada halfSizeImage. Toma la imagen existente (si la hubiera) y devuelve una versión de tamaño medio. Hagamos un intento.
- Agregue el siguiente código al final del patio de juegos:
Este código crea un objeto UIImage a partir del archivo Book4iOS8.png, que he agregado a los recursos de este patio de recreo. Cuando ingresa este código, el tamaño de la imagen se muestra en la barra lateral del área de juegos (Figura 6).
Figura 6 – La imagen es 250 x 327 |
- Mueva el puntero del mouse a la derecha del tamaño de la imagen y haga clic en el icono Vista rápida (el ojo) para ver la imagen (Figura 7).
Figura 7: coloque el cursor sobre el icono Vista rápida para ver la imagen. |
- Ahora agregue el siguiente código al guión gráfico que hace referencia al halfSizeImage propiedad de extensión:
- Cuando ingresa esta nueva línea de código, la barra lateral muestra el tamaño de la nueva imagen devuelta por la propiedad calculada, la mitad del tamaño original (Figura 8).
Figura 8: la imagen de tamaño medio es 125×164 |
- Mueva el puntero del mouse a la derecha de la nueva línea de código y haga clic en el botón Vista rápida para ver la imagen de tamaño medio (Figura 9).
Figura 9: Vista rápida muestra la imagen de tamaño medio |
¡La propiedad calculada de la extensión está funcionando!
Agregar subíndices
Extensions.playground contiene otra extensión que demuestra cómo agregar un subíndice a una clase existente:
Este subíndice acepta un valor de índice entero y devuelve el carácter en ese índice.
- Agregue el siguiente código al final del área de juegos para probar esta extensión:
- Este código crea una variable String que contiene 26 caracteres, luego solicita el carácter en la posición 0. La barra lateral de resultados muestra los valores en Figura 10.
Figura 10 – ¡La extensión del subíndice en acción! |
Esto es exactamente correcto. El primer carácter de la cadena es la letra segundo.
Intente experimentar con otros valores, incluidos números negativos y números mayores de 25. El subíndice devuelve nulo en ambos casos.
Reglas de extensión
Aquí hay algunas cosas más a tener en cuenta sobre las extensiones:
- Puede agregar más de un miembro a una clase en una sola extensión.
- Es una buena práctica agregar métodos relacionados a una sola extensión.
- No hay límite para la cantidad de extensiones que puede agregar a una clase.
- Los miembros agregados a una clase por una extensión son heredados por subclases.
Conclusión
Con suerte, puede ver el poder de las extensiones y cómo se pueden aplicar de manera práctica para facilitar la codificación del día a día. Las extensiones le permiten resolver un problema una vez y reutilizar la solución muchas veces en varios proyectos de iOS. Recuerde, es una buena práctica crear extensiones en lugar de subclasificar las clases de Cocoa Touch Framework siempre que sea posible.