Posts

¿Quieres recibir posts, cheatCodes, enlaces y katas en Swift para practicar?

Quincenalmente recibirás en tu correo electrónico la newsletter, solo hace falta tu correo electrónico. 

Puedes darte de baja cuando quieras.

  • Animatable

    El protocolo Animatable nos permite de una manera muy sencilla trabajar propiedades que cambian de valor para animar su movimiento desde la vista. Es un tipo que describe como animar una propiedad de la vista. Disponible desde iOS 13 Si bien el protocolo no exige que se añada la propiedad animatableData, ésta nos permitirá asignar […]

  • 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

    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

    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

    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

    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

    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

    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 

    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

    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:

  • Atributo Lazy en propiedades e iteraciones en Swift

    He aquí las características de las propiedades tipo lazy y las iteraciones tipo lazy.

  • CoreData y NSCompoundPredicate

    En mi proyecto final del Swift Full Stack Bootcamp de Apple Coding Academy, quería que el usuario pudiera filtrar por tags los encuentros que puede obtener. Para ello tenía que actualizar el @FetchRequest cada vez que el usuario pulsaba una tag. 💡Descubrí que existe NSCompoundPredicate: un array de NSPredicate en el que se puede definir […]

  • Breakpoint con autocompletado

    Si estás haciendo debug en TextField o TextEditor para posteriores acciones y tienes que completarlos cada vez que ejecutas el simulador, las acciones de los Breakpoints pueden hacer ese trabajo por ti.

  • Error project.pbxproj en proyecto de Xcode

    Recientemente xCode me mostró un error al intentar abrir un proyecto en el que había trabajado hace algún tiempo. Había hecho algunos cambios en la organización de los archivos y carpetas, al intentar abrir el proyecto me apareció lo siguiente (1): Project /Users/adrian/MyProject/MyProject.xcodeprojcannot be opened because it is missing its project.pbxproj file Después de realizar […]

  • Encadenando actividades

    La manera más sencilla de hacerte de nuevos hábitos es encadenando un hábito que ya tienes al que quieres adquirir. Nuestro día a día es una sucesión de actividades. La mayoría de las veces no las pensamos, simplemente nos van llevando de la mano una detrás de otra. Lo que evitan es que pienses, que […]

  • Registro de actividades

    Al comenzar hábitos sueles estar motivado, es como un subidón que te anima a prepararte para hacerlos, que te acompaña y te convence de que hay que hacerlos en el momento que has pensado. Tienes una imagen, un fin, un objetivo, un destino que quieres alcanzar. Es relativamente fácil. Luego van pasando los días y […]

  • Intro

    Estás ahora mismo en un proyecto de una duración específica, tienes dedicación completa a él y tienes claros los objetivos que quieres alcanzar al finalizarlo.¿Cómo no perder la motivación?¿Cómo mantener las prioridades bien claras durante el proceso?¿Cómo maximizar el esfuerzo combinándolo con el resto de tus actividades? Si te encuentras con una disposición del 100% […]