<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
    <channel>
        <title>YPG - Swift</title>
        <link>http://ypg.mozello.com/blogs/tutoriales/</link>
        <description>YPG - Swift</description>
                    <item>
                <title>Concurrencia en Swift</title>
                <link>http://ypg.mozello.com/blogs/tutoriales/params/post/4408547/concurerncia-en-swift</link>
                <pubDate>Fri, 22 Dec 2023 12:17:00 +0000</pubDate>
                <description>&lt;span class=&quot;moze-large&quot;&gt;Swift tiene soporte nativo para la escritura de código concurrente. El código concurrente es aquel que se ejecuta fuera del hilo principal de ejecución sin afectarlo. Para que podamos comprender lo que es el código concurrente y su implicación debemos conocer como Swift opera.&lt;/span&gt;&lt;p&gt;&lt;span class=&quot;moze-large&quot;&gt;En cualquier programa escrito es Swift al iniciarse&amp;nbsp; se crea un hilo de ejecución principal &quot;@main&quot;. Este hilo de ejecución realiza cíclicamente un sondeo para detectar eventos de entradas, ejecutar código del usuario y actualizar la interfaz gráfica. Este sondeo es lo suficientemente rápido para dar la impresión que la aplicación reacciona al instante. Para lograr ello, el código síncrono, es decir el lineal,&amp;nbsp; debe ser lo suficientemente optimizado. Pero esta capacidad de respuesta inmediata se ve afectada si se intenta ejecutar una operación pesada o que dependa de factores externos como velocidad y acceso a servicios en redes. Entonces se experimenta lo que conocemos como laps o retardos e incluso puede llegar a bloquearse por completo la aplicación.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;moze-large&quot;&gt;La solución a este problema es el código concurrente. Debido a que Swift ejecuta el código asíncrono o concurrente fuera del hilo principal y pararelo a este, el hilo principal puede seguir ejecutándose y responder a los eventos del usuario, e incluso puede seguir ejecutando otro código sobre demanda.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;moze-large&quot;&gt;Algo importante a tener en cuenta es que el código concurrente solo puede ser llamado desde otro código concurrente. Esta restricción esta implentada intencionalmente en Swift debido a que resulta muy inseguro llamar código concurrente desde código &lt;span style=&quot; float: none;&quot;&gt;síncrono&lt;/span&gt;.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;moze-large&quot;&gt;Una función o método &lt;span style=&quot; float: none;&quot;&gt;asíncrono&lt;/span&gt;&amp;nbsp;llava la palabra reservada &lt;b&gt;async&lt;/b&gt; al final de la lista de parámetros y antes del valor de retorno, o de throws si es una función de lanzamiento. Ejemplo:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;moze-large&quot;&gt;&lt;b&gt;func listPhotos() async -&amp;gt;[Image]{&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;moze-large&quot;&gt;&lt;b&gt;}&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;moze-large&quot;&gt;Para llamar a una función asincrónica debe utilizar la palabra reservada &lt;b&gt;await&lt;/b&gt; que indica una posible pausa en la ejecución del código actual hasta el retorno de una función o método &lt;span style=&quot; float: none;&quot;&gt;asíncrono&lt;/span&gt;. Ejemplo:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;moze-large&quot;&gt;&lt;b&gt;let result = await listPhotos()&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;moze-large&quot;&gt;Para llamara a una función &lt;span style=&quot; float: none;&quot;&gt;asíncrona&lt;/span&gt;&amp;nbsp;desde SwiftUI utilice &lt;b&gt;Task&lt;/b&gt; para crear un contexto &lt;span style=&quot; float: none;&quot;&gt;asíncrono&lt;/span&gt; en donde poder llamar la función:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;moze-large&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;b&gt;&lt;span class=&quot;s1&quot;&gt;&lt;span class=&quot;Apple-converted-space moze-large&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;s2 moze-large&quot;&gt;Button&lt;/span&gt;&lt;span class=&quot;s1 moze-large&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;moze-large&quot;&gt;&quot;Tap me&quot;&lt;/span&gt;&lt;span class=&quot;s1 moze-large&quot;&gt;){&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;b&gt;&lt;span class=&quot;Apple-converted-space moze-large&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s2 moze-large&quot;&gt;Task&lt;/span&gt;&lt;span class=&quot;moze-large&quot;&gt;{&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;b&gt;&lt;span class=&quot;Apple-converted-space moze-large&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s3 moze-large&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;moze-large&quot;&gt;&amp;nbsp;listPhotos()&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;b&gt;&lt;span class=&quot;Apple-converted-space moze-large&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;moze-large&quot;&gt;}&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;b&gt;&lt;span class=&quot;Apple-converted-space moze-large&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;moze-large&quot;&gt;}&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;span class=&quot;moze-large&quot;&gt;


Otro ejemplo, un poco más complejo, lo tenemos aqui: Una función que acepta dos parámetros, un String y como segundo un closure &lt;span style=&quot; float: none;&quot;&gt;asíncrono&lt;/span&gt; con el valor del primer parámetro. Debido a que la función retorna un closure asíncrono, el parámetro de closure debe ser asíncrono también.&lt;/span&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;moze-large&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;b&gt;&lt;span class=&quot;s1 moze-large&quot;&gt;func&lt;/span&gt;&lt;span class=&quot;moze-large&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2 moze-large&quot;&gt;caller&lt;/span&gt;&lt;span class=&quot;moze-large&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2 moze-large&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;moze-large&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;s3 moze-large&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;moze-large&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;s2 moze-large&quot;&gt;action&lt;/span&gt;&lt;span class=&quot;moze-large&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;s1 moze-large&quot;&gt;@escaping&lt;/span&gt;&lt;span class=&quot;moze-large&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;s3 moze-large&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;moze-large&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;s1 moze-large&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;moze-large&quot;&gt; -&amp;gt;()) &lt;/span&gt;&lt;span class=&quot;s1 moze-large&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;moze-large&quot;&gt; -&amp;gt;(){&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;b&gt;&lt;span class=&quot;Apple-converted-space moze-large&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s1 moze-large&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;moze-large&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s1 moze-large&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;moze-large&quot;&gt; action(value)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;moze-large&quot;&gt;&lt;b&gt;}&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;span class=&quot;moze-large&quot;&gt;


Para llamar a esta función desde SwiftUI u otra función tendríamos:&lt;/span&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;moze-large&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;b&gt;&lt;span class=&quot;s1&quot;&gt;&lt;span class=&quot;Apple-converted-space moze-large&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;s2 moze-large&quot;&gt;Button&lt;/span&gt;&lt;span class=&quot;s1 moze-large&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;moze-large&quot;&gt;&quot;Tap me&quot;&lt;/span&gt;&lt;span class=&quot;s1 moze-large&quot;&gt;){&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;b&gt;&lt;span class=&quot;Apple-converted-space moze-large&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s2 moze-large&quot;&gt;Task&lt;/span&gt;&lt;span class=&quot;moze-large&quot;&gt;{&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;b&gt;&lt;span class=&quot;Apple-converted-space moze-large&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s3 moze-large&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;moze-large&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s4 moze-large&quot;&gt;caller&lt;/span&gt;&lt;span class=&quot;moze-large&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s4 moze-large&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;moze-large&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;s5 moze-large&quot;&gt;&quot;Yorj&quot;&lt;/span&gt;&lt;span class=&quot;moze-large&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;Apple-converted-space moze-large&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span class=&quot;moze-large&quot;&gt;{str &lt;/span&gt;&lt;span class=&quot;s3 moze-large&quot;&gt;in&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;b&gt;&lt;span class=&quot;Apple-converted-space moze-large&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s6 moze-large&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;moze-large&quot;&gt;(str)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;b&gt;&lt;span class=&quot;Apple-converted-space moze-large&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;moze-large&quot;&gt;}&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;b&gt;&lt;span class=&quot;Apple-converted-space moze-large&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;moze-large&quot;&gt;}&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;b&gt;&lt;span class=&quot;Apple-converted-space moze-large&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;moze-large&quot;&gt;}&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;


&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;span class=&quot;moze-large&quot;&gt;Una vez que es llamado una función o método concurrente, la ejecución del código actual se suspende hasta el retorno de la función &lt;span style=&quot; float: none;&quot;&gt;asíncrona&lt;/span&gt;. Cuando retorna la función se reanuda la ejecución del código en el punto donde se suspendió.&lt;/span&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;h3&gt;&lt;span class=&quot;moze-large&quot;&gt;Operaciones asincrónicas en paralelo:&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;&lt;span class=&quot;moze-large&quot;&gt;Aunque las operaciones &lt;span style=&quot; float: none;&quot;&gt;asíncronas&lt;/span&gt;&amp;nbsp;se realizan en paralelo, cada operación debe esperar a terminar para dar paso a la siguiente. Esto produce un código secuencial&amp;nbsp;que no es óptimo para realizar varias tareas a la vez.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;moze-large&quot;&gt;Para lograr que el código &lt;span style=&quot; float: none;&quot;&gt;asíncrono&lt;/span&gt; se ejecute de forma paralela al código circundante utilice la notación: &lt;b&gt;async let&lt;/b&gt; = nombreFunciónAsincrónica:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;moze-large&quot;&gt;&lt;b&gt;async let result1 = test1()&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot; float: none;&quot; class=&quot;moze-large&quot;&gt;async let result2 = test2()&lt;/span&gt;&lt;br&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; float: none;&quot; class=&quot;moze-large&quot;&gt;&lt;b&gt;async let result3= test3()&lt;/b&gt;&lt;/span&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; float: none;&quot; class=&quot;moze-large&quot;&gt;Después cuando quiera recuperar el valor de estas funciones escriba &lt;b&gt;await&lt;/b&gt; delante de cada constante:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;moze-large&quot;&gt;&lt;b&gt;let resultTotal = await [result1, result2, result3]&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;moze-large&quot;&gt;De esta forma se logra que las funciones sincrónicas se ejecuten en paralelo, sin haber esperas entre ellas.&lt;/span&gt;&lt;/p&gt;&lt;h3&gt;&lt;b&gt;Actores:&lt;/b&gt;&lt;/h3&gt;&lt;p&gt;Debido a que las funciones asíncronas están asialadas entre si, es seguro ejecutarlas al mismo tiempo. Sin embargo a veces es útil compartir información entre funciones asíncronas. La solución a ello son los actores. Un actor es un tipo por referencia, como las clases, que permite compartir información entre código concurrente. Los actores garantizan que su estado mutable (sus propiedades) sean accedidas y modificadas por un código concurrente a la vez. Esto resuelve los posibles conflictos de acceso superpuesto sobre una misma propiedad. Un ejemplo de actor seria:&lt;/p&gt;&lt;p&gt;&lt;b&gt;actor temperaturas {&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;var arrayTemp : [Double] = []&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;var tempMax : Double&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;init(tempMax : Double){&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;self.tempMax = tempMax&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;}&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;func addValor(valor : Double){&lt;br&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;arrayTemp.append(valor)&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;}&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;}&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;Para acceder a este actor debe primero crear una instancia del mismo. Luego para leer algunas de sus propiedades se debe utilizar la palabra reservada await para indicar un posible punto de suspención:&lt;/p&gt;&lt;p&gt;&lt;b&gt;let actor = temperaturas(tempMax:&amp;nbsp; 14)&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;print( await actor.tempMax)&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Para modificar el estado mutable de un actor debe crear un método dentro del propio actor para ello. Por ejemplo:&lt;/p&gt;&lt;p&gt;&lt;b&gt;extensión temperaturas {&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;func setTempMax(value : Double){&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;self.tempMax = value&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;}&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;}&lt;/b&gt;&lt;/p&gt;&lt;h3&gt;Propiedades Calculadas Async&lt;/h3&gt;&lt;p&gt;Las propiedades calculadas también pueden ser asíncronas. La única regla es que deben ser de solo lectura. Utilice &lt;b&gt;await&lt;/b&gt; para acceder a su valor:&lt;/p&gt;&lt;p&gt;
&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;b&gt;struct&lt;span class=&quot;s1&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;yy&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt; {&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;b&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;s3&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;s4&quot;&gt;contents&lt;/span&gt;: &lt;span class=&quot;s5&quot;&gt;Int&lt;/span&gt; { &lt;span class=&quot;s3&quot;&gt;get&lt;/span&gt; &lt;span class=&quot;s3&quot;&gt;async&lt;/span&gt; {&lt;/b&gt;&lt;/p&gt;
&lt;p class=&quot;p3&quot;&gt;&lt;b&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s6&quot;&gt;45&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p class=&quot;p3&quot;&gt;&lt;b&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;/span&gt;}&lt;/b&gt;&lt;/p&gt;
&lt;p class=&quot;p3&quot;&gt;&lt;b&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;}&lt;/b&gt;&lt;/p&gt;
&lt;p class=&quot;p3&quot;&gt;&lt;b&gt;}&lt;/b&gt;&lt;/p&gt;


&lt;b&gt;let tt= await yy().contents&lt;/b&gt;&lt;p&gt;&lt;/p&gt;</description>
            </item>
                    <item>
                <title>Crear modificador personalizado</title>
                <link>http://ypg.mozello.com/blogs/tutoriales/params/post/4407529/crear-modifiador-persolalizado</link>
                <pubDate>Wed, 20 Dec 2023 23:49:00 +0000</pubDate>
                <description>En SwiftUI, el marco de desarrollo visual para swift, los modificadores son simplemente funciones que envuelven una vista y retornan una nueva vista.&amp;nbsp; Una de las características poderosas que tiene el lenguaje Swift es la habilidad de poder crear nuestros propios modificadores.&amp;nbsp; Para ello solo debemos extender la funcionalidad de un objeto como VStack, Button, Label, Color, etc... o también, podemos extender la vista raíz View y asi hacer el modificador accesible para cualquier vista que tengamos.&lt;p&gt;Por ejemplo.&amp;nbsp;&lt;span style=&quot; float: none;&quot;&gt;Esto crea una función de tipo modificador que añade la funcionalidad de poder ocultar una vista según un valor true/false dado.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;En cualquier parte de nuestro código, o dentro de un archivo swift, con alcance global:&lt;/p&gt;&lt;p&gt;
&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;b&gt;extension&lt;/b&gt;&lt;span class=&quot;s1&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;View&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt; {&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s3&quot;&gt;@ViewBuilder&lt;/span&gt; &lt;span class=&quot;s4&quot;&gt;&lt;b&gt;func&lt;/b&gt;&lt;/span&gt; &lt;span class=&quot;s5&quot;&gt;isHidden&lt;/span&gt;(&lt;span class=&quot;s5&quot;&gt;_&lt;/span&gt; isHidden: &lt;span class=&quot;s3&quot;&gt;Bool&lt;/span&gt;) -&amp;gt; &lt;span class=&quot;s4&quot;&gt;&lt;b&gt;some&lt;/b&gt;&lt;/span&gt; &lt;span class=&quot;s3&quot;&gt;View&lt;/span&gt; {&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s4&quot;&gt;&lt;b&gt;if&lt;/b&gt;&lt;/span&gt; isHidden {&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s4&quot;&gt;&lt;b&gt;self&lt;/b&gt;&lt;/span&gt;.&lt;span class=&quot;s6&quot;&gt;hidden&lt;/span&gt;()&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;} &lt;span class=&quot;s4&quot;&gt;&lt;b&gt;else&lt;/b&gt;&lt;/span&gt; {&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s4&quot;&gt;&lt;b&gt;self&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;}&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;}&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;}&lt;/p&gt;


Un ejemplo de su uso sería:&lt;p&gt;
&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;@State&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; &lt;/span&gt;&lt;b&gt;private&lt;/b&gt;&lt;span class=&quot;s2&quot;&gt; &lt;/span&gt;&lt;b&gt;var&lt;/b&gt;&lt;span class=&quot;s2&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s3&quot;&gt;isHidden&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; = &lt;/span&gt;&lt;b&gt;true&lt;/b&gt;&lt;/p&gt;


Button(&quot;OK&quot;){ //code }&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span class=&quot;s1&quot;&gt;.&lt;/span&gt;isHidden&lt;span class=&quot;s1&quot;&gt;(&lt;/span&gt;isHidden&lt;span class=&quot;s1&quot;&gt;)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Otra forma de crear nuestros modificadores personalizados es utilizando struct que conformen el protocolo&amp;nbsp;ViewModifier. La manera de aplicar este tipo de modificador es utilizando el modificador especial&amp;nbsp;&lt;b&gt;&lt;span class=&quot;s1&quot;&gt;.&lt;/span&gt;modifier&lt;/b&gt;&lt;span class=&quot;s1&quot;&gt;&lt;b&gt;(&quot;NombreModificador&quot;)&lt;/b&gt; en una vista: Button, Text, etc... Por ejemplo, el siguiente modificador crea un botón con degradado de colores:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;s1&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;//Buttom Style&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&lt;b&gt;struct&lt;/b&gt;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; &lt;/span&gt;GradientButtonStyle&lt;span class=&quot;s2&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;s3&quot;&gt;ViewModifier&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; {&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p3&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&lt;b&gt;var&lt;/b&gt;&lt;/span&gt; &lt;span class=&quot;s4&quot;&gt;alto&lt;/span&gt; : &lt;span class=&quot;s3&quot;&gt;CGFloat&lt;/span&gt; = &lt;span class=&quot;s5&quot;&gt;20&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p3&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&lt;b&gt;var&lt;/b&gt;&lt;/span&gt; &lt;span class=&quot;s4&quot;&gt;ancho&lt;/span&gt; : &lt;span class=&quot;s3&quot;&gt;CGFloat&lt;/span&gt; = &lt;span class=&quot;s5&quot;&gt;100&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p3&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&lt;b&gt;var&lt;/b&gt;&lt;/span&gt; &lt;span class=&quot;s4&quot;&gt;colors&lt;/span&gt; : [&lt;span class=&quot;s3&quot;&gt;Color&lt;/span&gt;] = [.&lt;span class=&quot;s6&quot;&gt;red&lt;/span&gt;, .&lt;span class=&quot;s6&quot;&gt;orange&lt;/span&gt;]&lt;/p&gt;
&lt;p class=&quot;p3&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&lt;b&gt;func&lt;/b&gt;&lt;/span&gt; &lt;span class=&quot;s4&quot;&gt;body&lt;/span&gt;(&lt;span class=&quot;s4&quot;&gt;content&lt;/span&gt;: &lt;span class=&quot;s3&quot;&gt;Content&lt;/span&gt;) -&amp;gt; &lt;span class=&quot;s1&quot;&gt;&lt;b&gt;some&lt;/b&gt;&lt;/span&gt; &lt;span class=&quot;s3&quot;&gt;View&lt;/span&gt; { content&lt;/p&gt;
&lt;p class=&quot;p3&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;.&lt;span class=&quot;s6&quot;&gt;frame&lt;/span&gt;(&lt;span class=&quot;s6&quot;&gt;width&lt;/span&gt;: &lt;span class=&quot;s7&quot;&gt;ancho&lt;/span&gt;, &lt;span class=&quot;s6&quot;&gt;height&lt;/span&gt;: &lt;span class=&quot;s7&quot;&gt;alto&lt;/span&gt;)&lt;/p&gt;
&lt;p class=&quot;p3&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;.&lt;span class=&quot;s6&quot;&gt;foregroundColor&lt;/span&gt;(&lt;span class=&quot;s3&quot;&gt;Color&lt;/span&gt;.&lt;span class=&quot;s6&quot;&gt;white&lt;/span&gt;)&lt;/p&gt;
&lt;p class=&quot;p3&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;.&lt;span class=&quot;s6&quot;&gt;padding&lt;/span&gt;()&lt;/p&gt;
&lt;p class=&quot;p5&quot;&gt;&lt;span class=&quot;s2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;.&lt;/span&gt;background&lt;span class=&quot;s2&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s3&quot;&gt;LinearGradient&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;(&lt;/span&gt;gradient&lt;span class=&quot;s2&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;s3&quot;&gt;Gradient&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;(&lt;/span&gt;colors&lt;span class=&quot;s2&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;s7&quot;&gt;colors&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;), &lt;/span&gt;startPoint&lt;span class=&quot;s2&quot;&gt;: .&lt;/span&gt;top&lt;span class=&quot;s2&quot;&gt;, &lt;/span&gt;endPoint&lt;span class=&quot;s2&quot;&gt;: .&lt;/span&gt;bottom&lt;span class=&quot;s2&quot;&gt;))&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p3&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;.&lt;span class=&quot;s6&quot;&gt;cornerRadius&lt;/span&gt;(&lt;span class=&quot;s5&quot;&gt;15.0&lt;/span&gt;)&lt;/p&gt;
&lt;p class=&quot;p3&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;}&lt;/p&gt;
&lt;p class=&quot;p3&quot;&gt;}&lt;/p&gt;


Un ejemplo de uso seria:&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;s1&quot;&gt;
&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;Button&lt;span class=&quot;s1&quot;&gt;{&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;showGame&lt;/span&gt; = &lt;span class=&quot;s3&quot;&gt;&lt;b&gt;true&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;}&lt;span class=&quot;s4&quot;&gt;label&lt;/span&gt;: {&lt;/p&gt;
&lt;p class=&quot;p3&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;bloqueA&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;(&lt;/span&gt;&quot;gamecontroller&quot;&lt;span class=&quot;s1&quot;&gt;, &lt;/span&gt;&quot;Evaluación&quot;&lt;span class=&quot;s1&quot;&gt;)&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p4&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;}&lt;b&gt;.&lt;/b&gt;&lt;/span&gt;&lt;b&gt;&lt;span class=&quot;s4&quot;&gt;modifier&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s5&quot;&gt;GradientButtonStyle&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;(&lt;/span&gt;ancho&lt;span class=&quot;s1&quot;&gt;: &lt;/span&gt;sizeWigth&lt;span class=&quot;s1&quot;&gt;, &lt;/span&gt;colors&lt;span class=&quot;s1&quot;&gt;: &lt;/span&gt;colorGradientButton&lt;span class=&quot;s1&quot;&gt;))&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;


&lt;p&gt;Como se puede apreciar es una capacidad muy útil para personalizar nuestro código o construir nuestras propias bibliotecas de código prefrabricado para nuestros proyectos.&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;s1&quot;&gt;Espero que les haya resultado útil. Feliz codificación!&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;</description>
            </item>
                    <item>
                <title>Mostrar/Ocultar Barra de Progreso</title>
                <link>http://ypg.mozello.com/blogs/tutoriales/params/post/4407524/mostrarocultar-barra-de-progreso</link>
                <pubDate>Wed, 20 Dec 2023 23:35:00 +0000</pubDate>
                <description>&lt;p class=&quot;p1&quot;&gt;Actualmente no existe un modificador que permita ocultar una vista dado un valor. Una solución es hacer una extensión de View que incluya este comportamiento:&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;b&gt;extension&lt;/b&gt; View {&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;@ViewBuilder &lt;b&gt;func&lt;/b&gt; isHidden(_ isHidden: Bool) -&amp;gt; &lt;b&gt;some&lt;/b&gt; View {&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;b&gt;if&lt;/b&gt; isHidden {&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;b&gt;self&lt;/b&gt;.hidden()&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;} &lt;b&gt;else&lt;/b&gt; {&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;b&gt;self&lt;/b&gt;&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;}&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;}&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;}&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;br&gt;&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;Ahora podríamos aplicarla, por ejemplo, para mostrar/ocultar una barra de progreso mientras se realiza una tarea asincrónica:&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;
&lt;h3&gt;&lt;b&gt;Primero:&lt;/b&gt;&lt;/h3&gt;
&lt;p class=&quot;p1&quot;&gt;Definir la función asincrónica que realizará la tarea en segundo plano. Para hacerla lo más completa posible vamos a hacer una función que acepte un parámetro y devuelva el valor de ese parámetro en un closure:&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;b style=&quot;font-size: 14px;&quot;&gt;func&lt;/b&gt; test( name : String, action: &lt;span class=&quot;s1&quot;&gt;&lt;b&gt;@escaping&lt;/b&gt;&lt;/span&gt; (String)-&amp;gt;()) &lt;span class=&quot;s1&quot;&gt;&lt;b&gt;async&lt;/b&gt;&lt;/span&gt; {&lt;br&gt;&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;b style=&quot;font-size: 14px;&quot;&gt;let&lt;/b&gt; tt = name.lowercased()&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;sleep(3)&lt;/span&gt; &lt;span style=&quot;color: #678243&quot;&gt;//Hace una pausa de 3 segundo para simular trabajo…&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;b style=&quot;font-size: 14px;&quot;&gt;return&lt;/b&gt; action(tt)&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;}&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;h3&gt;&lt;b&gt;Segundo: dentro de nuestra Vista:&lt;/b&gt;&lt;/h3&gt;
&lt;p class=&quot;p1&quot;&gt;Nota: en este ejemplo, se muestra una barra de progreso circular hasta que se completa la tarea asincrónica. Después de lo cual se oculta.&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;br&gt;&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;@State &lt;b&gt;private&lt;/b&gt; &lt;b&gt;var&lt;/b&gt; show = &lt;b&gt;true&lt;/b&gt;&lt;/p&gt;
&lt;p class=&quot;p3&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;br&gt;&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;VStack {&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;Text(text)&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;.padding(25)&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;.overlay {&lt;span style=&quot;color: #678243&quot;&gt; //Mostrar la barra de progreso&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;ProgressView(label: {&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;Text(&quot;Cargando...&quot;)&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;})&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;.frame(width: 200) &lt;span style=&quot;color: #678243&quot;&gt;//Para que se vea todo el texto&lt;/span&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;.&lt;span class=&quot;s1&quot;&gt;isHidden&lt;/span&gt;(isHidden)&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;}&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;Button(&quot;OK&quot;){&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;text = &quot;&quot;&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;isHidden = &lt;b&gt;false&lt;/b&gt;&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;span style=&quot;color: #678243&quot;&gt;//las funciones &lt;span class=&quot;s1&quot;&gt;async&lt;/span&gt; deben de llamarse dentro de un contexto asincrónico y siempre precedidas por &lt;span class=&quot;s1&quot;&gt;await&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;Task{&lt;span class=&quot;Apple-converted-space&quot;&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&lt;b&gt;await&lt;/b&gt;&lt;/span&gt; test(name: &quot;Yorjandis&quot;) { str &lt;b&gt;in&lt;/b&gt;&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;text = str&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;isHidden = &lt;b&gt;true&lt;/b&gt;&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;}&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;}&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;}&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;}&lt;/p&gt;</description>
            </item>
                    <item>
                <title>Swift 5.9 Novedades</title>
                <link>http://ypg.mozello.com/blogs/tutoriales/params/post/4406133/swift-59-novedades</link>
                <pubDate>Mon, 18 Dec 2023 23:24:00 +0000</pubDate>
                <description>&lt;p&gt;&lt;span class=&quot;moze-huge&quot;&gt;Ha sido publicada la versión 5.9 de Swift, el lenguaje de programación preferido por la
comunidad &lt;/span&gt;&lt;a href=&quot;https://developer.apple.com/swift/&quot; target=&quot;_blank&quot;&gt;&lt;span class=&quot;moze-huge&quot;&gt;Apple Developer&lt;/span&gt;&lt;/a&gt;&lt;span class=&quot;moze-huge&quot;&gt; para el desarrollo de
software en sus distintas plataformas: iOS/ipadOS, macOS, watchOS, tvOs y
visionOS. Esta nueva iteración de Swift, soportada en Xcode 15.1,&amp;nbsp; viene
con numerosas características que favorecen la expresividad, claridad y
limpieza del código a la vez que elimina en su mayor parte el código repetitivo
sumando tiempo útil al desarrollador. Además introduce nuevos conceptos
como &lt;/span&gt;&lt;i&gt;&lt;span class=&quot;moze-huge&quot;&gt;tipos&amp;nbsp; no copiables&lt;/span&gt;&lt;/i&gt;&lt;span class=&quot;moze-huge&quot;&gt; y una forma útil de administrar,
programáticamente, el ciclo de vida de una variable.&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span class=&quot;moze-huge&quot;&gt;&lt;br&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;moze-huge&quot;&gt;Entre sus novedades están:&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;&lt;span style=&quot;color: #0f539d&quot;&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;

* If/switch como expresiones&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;moze-huge&quot;&gt;* Un sistema de generación de macros
expresivos&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;moze-huge&quot;&gt;*Empaquetamiento de parámetros en funciones&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;moze-huge&quot;&gt;*Nuevo
concepto de struct o enum no copiable: &lt;/span&gt;&lt;span class=&quot;moze-huge&quot;&gt;~Copyable&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;moze-huge&quot;&gt;*Nuevo operador &lt;/span&gt;&lt;span class=&quot;moze-huge&quot;&gt;consume&lt;/span&gt;&lt;span class=&quot;moze-huge&quot;&gt; para
controlar el alcance o ciclo de vida de una variable o tipo.&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;moze-huge&quot;&gt;*Soporte para interoperabilidad
bidireccional con C++&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;moze-huge&quot;&gt;*Nueva Macro para marcar clases como ObservableObject













&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;p&gt;&lt;span class=&quot;moze-huge&quot;&gt;&lt;br&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;moze-huge&quot;&gt;Veámoslo con un poco más de detalles.&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;br&gt;&lt;span class=&quot;moze-huge&quot;&gt;
&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;h2&gt;&lt;b&gt;If/switch
como expresiones(&lt;a href=&quot;https://github.com/apple/swift-evolution/blob/main/proposals/0380-if-switch-expressions.md&quot; target=&quot;_blank&quot;&gt;SE-0380&lt;/a&gt;):&lt;/b&gt;&lt;/h2&gt;&lt;b&gt;&lt;/b&gt;&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;span class=&quot;moze-huge&quot;&gt;Ahora podemos utilizar las estructuras
condicionales &lt;/span&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;if/switch&lt;/span&gt;&lt;/b&gt;&lt;span class=&quot;moze-huge&quot;&gt; para obtener el valor directamente de
una variable. Es decir, pueden actual como expresiones asignables a una
variable. Veamos un ejemplo:&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;import SwiftUI&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;let color : Color = if myGenere == &quot;M&quot; {.blue} else {.pink}&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;let color : Color = switch myGenere {&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;case &quot;M&quot;:
.blue&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;case &quot;H&quot;:
.pink&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;default: .black&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;}&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;span class=&quot;moze-huge&quot;&gt;Esta nueva técnica cobra relevancia en las
variables computadas donde sabemos que la palabra return puede ignorarse:&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;@State
private var color : Color {&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;switch myGenere {&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;case &quot;M&quot;:
.blue&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;case &quot;H&quot;:
.pink&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;default: .black&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;}&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;h2&gt;&lt;b&gt;Sistema
de Macros expresivos(&lt;a href=&quot;https://github.com/apple/swift-evolution/blob/main/proposals/0382-expression-macros.md&quot; target=&quot;_blank&quot;&gt;SE-0382&lt;/a&gt;, &lt;a href=&quot;https://github.com/apple/swift-evolution/blob/main/proposals/0389-attached-macros.md&quot; target=&quot;_blank&quot;&gt;SE-0389&lt;/a&gt;, &lt;a href=&quot;https://github.com/apple/swift-evolution/blob/main/proposals/0397-freestanding-declaration-macros.md&quot; target=&quot;_blank&quot;&gt;SE-0397&lt;/a&gt;):&lt;/b&gt;&lt;/h2&gt;

&lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;span class=&quot;moze-large&quot;&gt;Las macros son un recurso
que nos permite reducir el texto repetitivo a la vez que nos ayudan a crear
bibliotecas de código más expresivas. Son similares a funciones, pero no
pertenecen a su código. Las macros utilizan la biblioteca SwiftSyntax para
generar código que luego será insertado en su código de producción. De esta
forma ayudan a la generación de código reutilizable a la vez que contribuyen a
mantener el enfoque claro y expresivo de Swift. &lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span class=&quot;moze-large&quot;&gt;Una macro se compone de un
nombre precedido del símbolo @. Su uso en el código resulta natural e intuitivo.
Veamos un ejemplo tomado del sitio web de Swift.org:&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;//
Move storage from the stored properties into a dictionary,&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;//
turning the stored properties into computed properties.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;@DictionaryStorage&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;struct
Point {&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;&amp;nbsp; var x: Int = 1&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;var y: Int = 2&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;}&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;moze-large&quot;&gt;Otras de las ventajas de las macros es lo relativo a la observación de cambios en objetos: Antiguamente se tenia que ajustar la clase obervada al protocolo&amp;nbsp;@ObservableObject&amp;nbsp;y marcar las propiedades a verificar con @Published. Esto generaba mucho código repetitivo. Ahora,&amp;nbsp; con la macro @Observable todo este proceso se simplifica. Veamos un ejemplo:&lt;/span&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;b style=&quot;font-size: 14px;&quot;&gt;&lt;span class=&quot;moze-huge&quot;&gt;
&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;b style=&quot;font-size: 14px;&quot;&gt;@Observable &lt;span class=&quot;s1&quot;&gt;&lt;b&gt;final&lt;/b&gt;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&lt;b&gt;class&lt;/b&gt;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;User&lt;/span&gt;{&lt;/b&gt;&lt;/p&gt;&lt;b style=&quot;font-size: 14px;&quot;&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&lt;b&gt;var&lt;/b&gt;&lt;/span&gt; &lt;span class=&quot;s3&quot;&gt;name&lt;/span&gt; : &lt;span class=&quot;s4&quot;&gt;String&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&lt;b&gt;var&lt;/b&gt;&lt;/span&gt; &lt;span class=&quot;s3&quot;&gt;edad&lt;/span&gt; : &lt;span class=&quot;s4&quot;&gt;Int&lt;/span&gt;&amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&lt;b&gt;init&lt;/b&gt;&lt;/span&gt;(&lt;span class=&quot;s3&quot;&gt;name&lt;/span&gt;: &lt;span class=&quot;s4&quot;&gt;String&lt;/span&gt;, &lt;span class=&quot;s3&quot;&gt;edad&lt;/span&gt;: &lt;span class=&quot;s4&quot;&gt;Int&lt;/span&gt;) {&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&lt;b&gt;self&lt;/b&gt;&lt;/span&gt;.&lt;span class=&quot;s5&quot;&gt;name&lt;/span&gt; = name&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&lt;b&gt;self&lt;/b&gt;&lt;/span&gt;.&lt;span class=&quot;s5&quot;&gt;edad&lt;/span&gt; = &lt;span class=&quot;s6&quot;&gt;10&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;}&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;}&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;Luego para hacer uso de esta clase:&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;
&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&lt;b&gt;struct&lt;/b&gt;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;vista&lt;/span&gt; : &lt;span class=&quot;s3&quot;&gt;View&lt;/span&gt; {&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&lt;b&gt;private&lt;/b&gt;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&lt;b&gt;var&lt;/b&gt;&lt;/span&gt; &lt;span class=&quot;s4&quot;&gt;nombre&lt;/span&gt; : &lt;span class=&quot;s5&quot;&gt;User&lt;/span&gt; = &lt;span class=&quot;s5&quot;&gt;User&lt;/span&gt;(&lt;span class=&quot;s6&quot;&gt;name&lt;/span&gt;: &lt;span class=&quot;s7&quot;&gt;&quot;Yorjandis&quot;&lt;/span&gt;, &lt;span class=&quot;s6&quot;&gt;edad&lt;/span&gt;: &lt;span class=&quot;s8&quot;&gt;25&lt;/span&gt;)&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&lt;b&gt;var&lt;/b&gt;&lt;/span&gt; &lt;span class=&quot;s4&quot;&gt;body&lt;/span&gt;: &lt;span class=&quot;s1&quot;&gt;&lt;b&gt;some&lt;/b&gt;&lt;/span&gt; &lt;span class=&quot;s3&quot;&gt;View&lt;/span&gt; {&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s3&quot;&gt;VStack&lt;/span&gt;{&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s3&quot;&gt;Text&lt;/span&gt;(&lt;span class=&quot;s6&quot;&gt;nombre&lt;/span&gt;.&lt;span class=&quot;s6&quot;&gt;name&lt;/span&gt;)&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s3&quot;&gt;Button&lt;/span&gt;(&lt;span class=&quot;s7&quot;&gt;&quot;OK&quot;&lt;/span&gt;){&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s6&quot;&gt;nombre&lt;/span&gt;.&lt;span class=&quot;s6&quot;&gt;name&lt;/span&gt; = &lt;span class=&quot;s7&quot;&gt;&quot;Juancito&quot;&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;}&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;}&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;}&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;}&lt;/p&gt;


&lt;p&gt;&lt;/p&gt;&lt;/b&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;Las Macros en Swift se
escriben con un enfoque potente y flexible. Similar a una función pueden
aceptar parámetros para modificar su comportamiento de una manera dinámica.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;Actualmente, esta versión
de Swift admite macros en macOS y Linux, y próximamente Windows.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;

&lt;h2&gt;Empaquetado
de parámetros en funciones:&lt;/h2&gt;

&lt;p&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;Esta nueva opción nos
permite escribir tipos y funciones genéricas con una cantidad arbitraria de parámetros,
en una forma concisa y elegante. Esto viene a solucionar el problema del limite
superior de parámetros posibles. Por ejemplo, para definir una función genérica
que compruebe un número albitrario de parámetros como nil, tendríamos que hacer
uso de sobrecarga para abarcar todas las longitudes posibles de parámetros.
Esto nos lleva a establecer un límite lógico superior. Ahora con la nueva
notación de parámetros empaquetados podemos eliminar este inconveniente:&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;Func
ComprobarValorNulo&amp;lt;each setValores&amp;gt;(setValoresPosibles : repeat (each
setValores)?)-&amp;gt;(repeat [each setValores?]){&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;Return
(repeat [each setValores?])&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;}&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;

&lt;h2&gt;Nuevo concepto de struct o enum no
copiable: ~Copyable (&lt;a href=&quot;https://github.com/apple/swift-evolution/blob/main/proposals/0390-noncopyable-structs-and-enums.md&quot; target=&quot;_blank&quot;&gt;SE-0390&lt;/a&gt;)&lt;/h2&gt;

&lt;p&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;Swift 5.9 introduce el
concepto de tipos no copiables que significa que solo puede haber una instancia
en memoria. Se puede cambiar de propietario de la instancia, pero solo habrá
una sola referencia a dicha instancia. Esto permite el acceso a una única
instancia desde muchos lugares. Se ha intriducido una nueva sintaxis para
definir este comportamiento: ~Copyable. &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;Por
ejemplo:&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;struct
User: ~Copyable {&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var name: String&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;}&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;Let
user1 = User(name: “juan”)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;Let
userCopy = user1&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;Print(user1.name) //!ERROR
el compilador nos dirá que este tipo ya ha sido consumido.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;Al hacer la copia de la
instancia de user1 a userCopy se ha cambiado el propietario de la instancia. Ya
user1 es nil porque su valor ha sido “Consumido”.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;Esta restricción también
se aplica a los parámetros de tipo no copiables adicinando dos nuevas palabras
de lenguajes: consuming y borrowing. La primera le indica a la función que el
tipo no copiable pasado como parámetros será consumido al finalizar la función.
La segunda palabra “borrowing” o borrador le indica a la función que debe tomar
prestado una copia de solo lectura del valor. Por ejemplo:&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;struct
Persona : ~Copyable{&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; let name : String&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;}&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;func
test(){&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; let p1 = Persona(name: &quot;juan&quot;)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; consumir(a: p1)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print(p1.name) //Error!! El valor de P1 ha
sido consumido al finalizar la func consumir(a : )…&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;}&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;func
test2(){&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;let
p1 = Persona(name: &quot;juan&quot;)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; NoConsumir (a: p1)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print(p1.name) //el valor aún puede ser leído
porque no se ha consumido&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;} &lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;func
consumir(a : consuming Persona){&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;&amp;nbsp;&amp;nbsp; print(a.name)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;}&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;func NoConsumir(a : borrowing
Persona){&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;print(a.name)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;}&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt; &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;

&lt;h2&gt;Soporte para interoperabilidad
bidireccional con C++&lt;/h2&gt;

&lt;p&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;Swift 5.9 introduce una amplia
interoperabilidad con el lenguaje C++ y ObjectiveC++ permitiendo el uso código
nativo C++ en Swift y viceversa con muy poco esfuerzo. &lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;La interoperabilidad de
C++ está evolucionando activamente, con algunos aspectos sujetos a cambios en
futuras versiones a medida que la comunidad recopile comentarios sobre la
adopción en el mundo real en bases de código mixtas de Swift y C++.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;Para obtener información
sobre cómo habilitar la interoperabilidad de C++ y el subconjunto de idiomas
admitidos, consulte la &lt;/span&gt;&lt;a href=&quot;https://www.swift.org/documentation/cxx-interop/&quot;&gt;&lt;span class=&quot;moze-huge&quot;&gt;documentación&lt;/span&gt;&lt;/a&gt;&lt;span class=&quot;moze-huge&quot;&gt;.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;

&lt;h2&gt;Nueva Macro para marcar clases como ObservableObject&lt;/h2&gt;

&lt;p&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;Con el nuevo sistema de
Macros expresivas en Swift 5.9 ahora podemos marcar clases como conformen al
protocolo Observable con solo una sola palabra: @Observable. Esto hace automáticamente
todas las propiedades de la clases como públicas pudiendo reaccionar luego a
los cambios de estado. Veamos un ejemplo sencillo:&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;import SwiftUI&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;final class Yorjan :
ObservableObject {&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;var
name : String&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var edad : Int&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; init(name: String, edad: Int) {&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.name = name&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.edad = 10&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;}&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;}&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;struct vista : View {&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;&amp;nbsp;&amp;nbsp; private var nombre : Yorjan = Yorjan(name:
&quot;Yorjandis&quot;, edad: 25)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;var
body: some View {&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; VStack{&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Text(nombre.name)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Button(&quot;OK&quot;){&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;nombre.name =
&quot;juancito&quot;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;}&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;span class=&quot;moze-huge&quot;&gt;Muchas otras mejoras se
han añadido como el soporte para una mejor detección de errores en Xcode, optimización
para operaciones de concurrencia, mejoras en el Swift Package Manager, etc.
Podeis ver la lista completa &lt;a href=&quot;https://www.swift.org/blog/swift-5.9-released/&quot; target=&quot;_blank&quot;&gt;aquí&lt;/a&gt;.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;</description>
            </item>
            </channel>
</rss>