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.

  • Layout y ViewThatFits

    Si queremos crear contenedores personalizados, SwiftUI nos proporciona el protocolo Layout, que nos permite definir el tamaño de un contenedor de vistas y el sitio en donde estará ubicada cada una de ellas. Por ejemplo, que pasaría si queremos que un grupo de vistas, que por defecto utilizan el tamaño intrínseco del contenido, tengan el mismo ancho. Ancho establecido por la de mayor tamaño de todas ellas. ¿Cómo notificamos ese ancho al contenedor y que éste reparta el espacio disponible? ¿Que pasa si queremos mostrar la vista que mejor se adapte a ese ancho? A partir de iOS 16  tenemos…

  • Atajos Navigator Xcode

    Xcode es de las herramientas más configurables en cuanto atajos de teclado se refiere. Puedes crear, cambiar o eliminarlos desde el menú Xcode -> Settings -> Key Bindings. Es una extensa lista de todos los comandos con sus atajos de teclado. Aquí dejo algunos, son principalmente de la barra de navigators, que aparece a la izquierda. Comencemos con el equivalente de teclas: ⌘ Comando (o Cmd) ⇧ Mayúsculas⌥ Opción (o Alt)⌃ Control (o Ctrl) En la imagen puedes ver el listado, deja aquí algunas notas adicionales. Navigation Bar Los nombres de los archivos en Cursiva son temporales, para hacerlos permanentes…

  • 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 el nuevo valor cuando el estado cambie a la propiedad (en el ejemplo isOn) que usaremos en nuestro struct como referencia del valor. Vamos a crear animaciones de nuestros Textos, Botones y Shapes, pasando los valores con el operador ternario para cambiar el estado. Para…

  • 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 tipo dinámico, que especifica qué tan grande debe ser el contenido que ha sido definido como escalable”. Disponible a partir de iOS 15 De esta propiedad podemos obtener el tamaño de letra que tiene elegido el usuario y una propiedad tipo Bool isAccesibilitySize que nos…

  • 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 la información de cada uno de ellos, pero con dos o tres propiedades te bastaría. Operador de coalescencia nula: ?? Proporciona una manera de desempaquetar valores, permitiendo especificar un valor por defecto, si el valor de la izquierda es nil tomará el de la derecha.…

  • 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 hacerlo de 2 x 2 y de 1 x 4, por ejemplo. Los iconos son los mismos, de hecho uno de ellos tiene que ser un botón que permite marcar como favorito y el resto simplemente vistas. Los intentaré simplificar para centrarnos en el @ViewBuilder.…

  • 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 la lógica al asignar un valor a la propiedad o cuando es invocada. Os traigo el ejemplo de un property wrapper que se encargará de manejar la lectura y escritura de un dato tipo Codable en un archivo JSON en el directorio de documentos de…

  • 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 compararlo. El autoclosure es una técnica que permite esperar a evaluar una expresión hasta el momento en que lo necesitemos. En este ejemplo, la función es isStrongPassword por que lo expression devuelve un Bool, y necesitamos que espere hasta que sea evaluada por  XCTAssertThrowsError De…

  • 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 avisa al delegado que ha sido pulsado. (1) El protocolo ButtonDelegate que es del tipo AnyObject, una clase. (2) En el UIViewController se instancia ProfileView, siendo él mismo el delegado, y se añade a la view como una subvista y del tipo UIHostingController, con sus constraints…

  • 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, de esta manera puedo añadir toolbar, alerts, tasks, acciones (onChange, onAppear) en un solo lugar. 2. Toolbar Hay componentes que son únicos para esta vista, como lo es la toolbar, por lo que la añado como extensión, y que solo ActivitiesListView tenga acceso a ella. …

  • 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 pasar valores a los parámetros de una subsista. Ventajas:

  • 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 un tipo lógico como and, or o not. Así que añadí una static func a NSPredicate (1). Para poder llamarla desde la subvista (2) Y se muestre la barra si el usuario desea filtrar por tags (3), pasando el nuevo NSPredicate.

  • 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 la búsqueda correspondiente, encontré que se habían borrado dos archivos que están dentro en el paquete del archivo del proyecto (2) Puede existir otra carpeta llamada xcshareddata, pero lo habitual es que sean estos 3 (3): El error se daba porque dentro del paquete solo…

  • 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 no tengas nada que hacer, que no sepas lo siguiente que hacer. Si tienes la fortuna de tener un perro, tus días comenzarán con un paseo, bajar al perro a dar la primera vuelta del día. En mi caso, me levanto de la cama, paso…

  • 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 ese destino se empieza a difuminar, comienzas a sentir los efectos del esfuerzo, de la energía que requiere ponerte a ello en el momento y durante el tiempo establecido. Y es fácil abandonar, luchas por convencerte a ti mismo del porque lo tienes que hacer,…

  • 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% de tu tiempo para este proyecto, lo que debes tener claro desde un inicio cuales es el objetivo principal y cuales los objetivos secundarios. Además necesitarás de tiempo para cumplir otras tareas, para realizar otros objetivos que no estén relacionados directamente con el proyecto pero…