<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: tyoc213</title>
    <description>The latest articles on DEV Community by tyoc213 (@tyoc213).</description>
    <link>https://dev.to/tyoc213</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F33000%2F4d9993e3-2439-4774-a987-3c2078b4dcfe.jpeg</url>
      <title>DEV Community: tyoc213</title>
      <link>https://dev.to/tyoc213</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tyoc213"/>
    <language>en</language>
    <item>
      <title>Swinject, protocolos y tipos de datos</title>
      <dc:creator>tyoc213</dc:creator>
      <pubDate>Sun, 24 Nov 2019 21:01:39 +0000</pubDate>
      <link>https://dev.to/tyoc213/swinject-protocolos-y-tipos-de-datos-34gh</link>
      <guid>https://dev.to/tyoc213/swinject-protocolos-y-tipos-de-datos-34gh</guid>
      <description>&lt;p&gt;En general al empezar un proyecto si tienes la costumbre de crear un singleton para pasar de manera sencilla valores de un lado a otro, en su lugar deberías considerar la inyección de dependencias.&lt;/p&gt;

&lt;p&gt;Una forma rápida de lograrlo es usar una librería que implemente ese patron, en nuestro caso usaremos &lt;code&gt;Swinject&lt;/code&gt; y para hacer las cosas más fáciles de inyectar y pedir al contenedor, haremos uso de el protocolos y una extensión al mismo para que se pueda inyectar desde un &lt;code&gt;String&lt;/code&gt; hasta una &lt;code&gt;clase&lt;/code&gt;, &lt;code&gt;estructura&lt;/code&gt;, &lt;code&gt;valor de enumeración&lt;/code&gt;, etc.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="c1"&gt;// tyoc213&lt;/span&gt;

&lt;span class="kd"&gt;import&lt;/span&gt; &lt;span class="kt"&gt;Swinject&lt;/span&gt;

&lt;span class="kd"&gt;enum&lt;/span&gt; &lt;span class="kt"&gt;InjectName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;myValue&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;serviceResponse&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;anInt&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;extension&lt;/span&gt; &lt;span class="kt"&gt;Container&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="n"&gt;resolve&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;R&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;from&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;InjectName&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;R&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;r&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kt"&gt;Inject&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;R&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;InjectContainer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;from&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rawValue&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as!&lt;/span&gt; &lt;span class="kt"&gt;Inject&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;R&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="n"&gt;register&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;from&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;InjectName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kt"&gt;T&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
        &lt;span class="nf"&gt;register&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;InjectContainer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;from&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rawValue&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="kt"&gt;Inject&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;protocol&lt;/span&gt; &lt;span class="kt"&gt;InjectContainer&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;struct&lt;/span&gt; &lt;span class="kt"&gt;Inject&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kt"&gt;InjectContainer&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;T&lt;/span&gt;
    &lt;span class="nf"&gt;init&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kt"&gt;T&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Entonces, una vez creado el contenedor en el appDelegate se puede insertar y extraer datos de la siguiente forma&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="n"&gt;contenedor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;register&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;anInt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;contenedor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;register&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;serviceResponse&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;someInstance&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;contenedor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;register&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;myValue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"some value"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Y para obtener esos datos&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kt"&gt;Int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;contenedor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;anInt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kt"&gt;ResponseService&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;contenedor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;serviceResponse&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;contenedor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;myValue&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Se tiene que especificar el tipo de dato en la asignación ya que al ser un &lt;code&gt;template&lt;/code&gt; necesita resolver el tipo de dato al momento de compilar.&lt;/p&gt;

</description>
      <category>swift</category>
      <category>ios</category>
      <category>di</category>
    </item>
    <item>
      <title>No puedo correr Vulkan en surface 4</title>
      <dc:creator>tyoc213</dc:creator>
      <pubDate>Tue, 16 Oct 2018 00:00:44 +0000</pubDate>
      <link>https://dev.to/tyoc213/no-puedo-correr-vulkan-en-surface-4-28hf</link>
      <guid>https://dev.to/tyoc213/no-puedo-correr-vulkan-en-surface-4-28hf</guid>
      <description>

&lt;p&gt;En una surface 4, no había podido ejecutar programas en Vulkan y mi interes en aprender acerca del tema se vio un poco frustrado al no poder ejecutar los programas que compilaba para aprender.&lt;/p&gt;

&lt;p&gt;Después de ese año afortunadamente alguien en twitter me redirigio al (foro de Intel)[&lt;a href="https://communities.intel.com/thread/128769"&gt;https://communities.intel.com/thread/128769&lt;/a&gt;] donde alguien pudo replicar/comprobar el problema e indicarme como reinstalar los drivers para que funcionen correctamente, los pasos son los siguientes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Descargar el driver en &lt;code&gt;.zip&lt;/code&gt; from &lt;a href="https://downloadcenter.intel.com/download/27988/Intel-Graphics-Driver-for-Windows-10?product=88355"&gt;https://downloadcenter.intel.com/download/27988/Intel-Graphics-Driver-for-Windows-10?product=88355&lt;/a&gt; (o el más nuevo pero en .zip)&lt;/li&gt;
&lt;li&gt;Desconectar la computadora de internet (para que Windows no pueda buscar por sí mismo). 
3 - ir a &lt;code&gt;Administrador de Dispositivos&lt;/code&gt; -&amp;gt; &lt;code&gt;Adaptadores de video&lt;/code&gt;.
4 - Click-derecho en &lt;code&gt;Intel ® Integrated Graphics&lt;/code&gt;, seleccionar la opción de desinstalar y continuar hasta que sólo tengas el &lt;code&gt;Adaptador básico de Microsoft&lt;/code&gt;.
5 - Unzip el archivo del punto 1.
6 - Click-derecho en el &lt;code&gt;Adaptador básico de Microsoft&lt;/code&gt; y seleccionar "Actualizar controlador".
7 - Seleccionar la opción "Buscar en mi computadora el controlador".
8 - Seleccionar la opción "Dejame escoger de una lista de dispositivos en mi computadora".
9 - Seleccionar la opción "Tengo el disco".
10 - Seleccionar la opción "Explorar".
11 - Encontrar la carpeta "Graphics" en donde descomprimiste el zip en el paso 5. 
12 - Seleccionar el archivo de información de instalación (Típicamente nombrado como "idglh64" ó "igdlh").
13 - Click en &lt;code&gt;Abrir&lt;/code&gt; y luego en &lt;code&gt;Aceptar&lt;/code&gt;, finalmente click en &lt;code&gt;Siguiente&lt;/code&gt; y los drivers comenzarán a instalarse. 
14 - Reinicia la computadora cuando la instalación se haya completado.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Básicamente esos son los pasos, en mi caso variaron un poco (encontré más rápido el archivo y tube que quitar dos veces el controlador para que quedará como "básico").&lt;/p&gt;

&lt;p&gt;Después de esto pude ejecutar los diferentes programas de prueba de Vulkan.&lt;/p&gt;


</description>
      <category>vulkan</category>
      <category>intelgraphics</category>
    </item>
  </channel>
</rss>
