Categoría: Post

  • Dynamic Size Class

    Dynamic Size Class

    Si queremos incluir accesibilidad en nuestra app permitiendo que el tamaño del texto cambie si el usuario lo tiene así configurado (en Ajustes → Accesibilidad → Pantalla y tamaño del texto → Texto más grande), tenemos a nuestra disposición una variable de entorno (@Environment) llamada dynamicTypeSize.    El dynamic type size es “Un tamaño de…

  • Operador de coalescencia nula y protocolo Custom String Convertible

    Operador de coalescencia nula y protocolo Custom String Convertible

    Seguramente te has encontrado con una API en la que hayas tenido que utilizar propiedades opcionales en los structs, o bien has tenido que crear uno y después debes desempaquetar cada propiedad para mostrarla en una View de SwiftUI. Incluso cuando estás depurando el código e imprimes ese tipo de dato y te muestra toda…

  • ViewBuilders

    ViewBuilders

    En su documentación, Apple define los ViewBuilders como un elemento personalizado que construye una vista a partir de un closure. Tampoco es que se demasiado clara esta definición, pero básicamente te permite generar sub-vistas, componentizar el código, vamos. Para este ejemplo vamos a crear un Grid (compatible con iOS15), utilizando un @ViewBuilder, que pueda elegir…

  • Property wrappers personalizados

    Property wrappers personalizados

    Los property wrappers es una funcionalidad disponible desde Swift 5.1 que permiten asociar lógica cuando las propiedades cambian. Esencialmente envuelven el valor original añadiendo funcionalidades. Se pueden implementar como struct o class al añadir el atributo @propertywrapper. Para conformarse deben incluir una propiedad calculada llamada wrappedValue. Es en esta propiedad en la que se implementa…

  • XCTestXCTAssertThrowsErrorEqual

    XCTestXCTAssertThrowsErrorEqual

    Releyendo el libro Diseño Ágil con TDD de Carlos Blé Jurado (que recomiendo ampliamente) y practicando los ejercicios que incluye, he hecho esta extensión de XCTest que es función de test que evalúa 3 cosas: 1) La cabecera Primero debemos definir el genérico, en este caso esperamos un Error y que sea Equatable para poder…

  • UIHostingController

    UIHostingController

    SwiftUI ofrece un UIViewController para UIKit, que le permite gestionar la integración de vistas hechas en SwiftUI y presentarlas como otro UIViewController. En el ejemplo tendríamos una vista de ProfileView con una propiedad opcional delegate conformada con ButtonDelegate, que se encargará de conectar la acción con el UIViewController, mediante un Button. El botón de Salir…

  • ZStack personalizado

    ZStack personalizado

    Para dar un estilo único a las vistas del proyecto personal en el que estoy trabajando he creado un Stack personalizado.  El cual incluye un degradado, opcionalmente una imagen y un título que hacen de background. Comienza con la ActivitiesListView, que abstrae el ContentView y su toolbar mediante una extensión. 1. ActivitiesListView Agrupa el ContentView,…

  • Simplificando la inicialización en las vistas en SwiftUI

    Cuando  creamos componentes reutilizables de las vistas de SwiftUI podemos añadir la versatilidad que nos dan los inicializadores (inits) en los structs. Los structs tienen su inicializador por defecto, pero podemos añadir todos los que deseemos. En este ejemplo de una celda con varios parámetros: Gracias a las extensiones podemos crear inits a los que…

  • Creando puentes 

    Creando puentes 

    Existen 2 conceptos que nos facilitan la transformación de funciones síncronas a funciones asíncronas y a integrar vistas de SwiftUI en proyectos con UIKit

  • 5 formas de utilizar map

    5 formas de utilizar map

    Map es una poderosa herramienta que permite transformar cada elemento de una colección mediante una función o un closure. Tienes aquí 5 formas de utilizar map: