<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[NSHint]]></title>
  <link href="http://nshint.github.io/atom.xml" rel="self"/>
  <link href="http://nshint.github.io/"/>
  <updated>2024-03-26T00:54:45+01:00</updated>
  <id>http://nshint.github.io/</id>
  <author>
    <name><![CDATA[NSHint]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    
    <title type="html"><![CDATA[Array backwards compatibility using Property Wrappers]]></title>
    <link href="http://nshint.github.io/blog/2020/07/07/array-backwards-compatibility/"/>
    
    <updated>2020-07-07T14:19:05+02:00</updated>
    <id>http://nshint.github.io/blog/2020/07/07/array-backwards-compatibility</id>
    
    <content type="html"><![CDATA[<p>Let&rsquo;s assume that you&rsquo;re doing an application which shows your users pretty pictures of seasons. You contact your backend folks and they tell you that the world is simple, there are only three seasons:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='swift'><span class='line'><span class="k">enum</span> <span class="nl">Season</span><span class="p">:</span> <span class="n">String</span><span class="p">,</span> <span class="n">Decodable</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">case</span> <span class="n">spring</span><span class="p">,</span> <span class="n">summer</span><span class="p">,</span> <span class="n">autumn</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<!--more-->


<p>In order to compose things nicely, you put the seasons into a struct:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='swift'><span class='line'><span class="k">struct</span> <span class="nl">Seasons</span><span class="p">:</span> <span class="n">Decodable</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">var</span> <span class="nl">available</span><span class="p">:</span> <span class="p">[</span><span class="n">Season</span><span class="p">]</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>The following JSON comes from the server, it gets decoded, everything works well:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='json'><span class='line'><span class="s2">&quot;available&quot;</span><span class="err">:</span> <span class="p">[</span><span class="s2">&quot;spring&quot;</span><span class="p">,</span> <span class="s2">&quot;summer&quot;</span><span class="p">,</span> <span class="s2">&quot;autumn&quot;</span><span class="p">]</span>
</span><span class='line'><span class="err">//</span> <span class="p">[</span><span class="err">__lldb_expr_</span><span class="mi">12</span><span class="err">.Season.spring</span><span class="p">,</span> <span class="err">__lldb_expr_</span><span class="mi">12</span><span class="err">.Season.summer</span><span class="p">,</span> <span class="err">__lldb_expr_</span><span class="mi">12</span><span class="err">.Season.autumn</span><span class="p">]</span>
</span></code></pre></td></tr></table></div></figure>


<p>The application gets released. Time passes, winter comes and the app gets updated available seasons from the backend:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='json'><span class='line'><span class="s2">&quot;available&quot;</span><span class="err">:</span> <span class="p">[</span><span class="s2">&quot;spring&quot;</span><span class="p">,</span> <span class="s2">&quot;summer&quot;</span><span class="p">,</span> <span class="s2">&quot;autumn&quot;</span><span class="p">,</span> <span class="s2">&quot;winter&quot;</span><span class="p">]</span>
</span></code></pre></td></tr></table></div></figure>


<p>What happens now? Your functionality breaks.<br/>
Since the app can&rsquo;t understand <code>Season.winter</code>, no seasons get decoded. You receive a lot of bug reports, and your users are not happy ☹️</p>

<p>If only there was something we could do to prevent this from happening..<br/>
This seems like a nice use case for property wrappers!</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
</pre></td><td class='code'><pre><code class='swift'><span class='line'><span class="p">@</span><span class="n">propertyWrapper</span>
</span><span class='line'><span class="k">struct</span> <span class="n">IgnoreUnknown</span><span class="o">&lt;</span><span class="nl">Value</span><span class="p">:</span> <span class="n">Decodable</span><span class="o">&gt;:</span> <span class="n">Decodable</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">var</span> <span class="nl">wrappedValue</span><span class="p">:</span> <span class="p">[</span><span class="n">Value</span><span class="p">]</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">private</span> <span class="k">struct</span> <span class="nl">Empty</span><span class="p">:</span> <span class="n">Decodable</span> <span class="p">{}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">init</span><span class="p">(</span><span class="n">from</span> <span class="nl">decoder</span><span class="p">:</span> <span class="n">Decoder</span><span class="p">)</span> <span class="n">throws</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">var</span> <span class="n">container</span> <span class="o">=</span> <span class="n">try</span> <span class="n">decoder</span><span class="p">.</span><span class="n">unkeyedContainer</span><span class="p">()</span>
</span><span class='line'>        <span class="nb">self</span><span class="p">.</span><span class="n">wrappedValue</span> <span class="o">=</span> <span class="p">[]</span>
</span><span class='line'>        <span class="k">while</span> <span class="o">!</span><span class="n">container</span><span class="p">.</span><span class="n">isAtEnd</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">do</span> <span class="p">{</span>
</span><span class='line'>                <span class="n">wrappedValue</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">try</span> <span class="n">container</span><span class="p">.</span><span class="n">decode</span><span class="p">(</span><span class="n">Value</span><span class="p">.</span><span class="nb">self</span><span class="p">))</span>
</span><span class='line'>            <span class="p">}</span> <span class="n">catch</span> <span class="p">{</span>
</span><span class='line'>                <span class="n">_</span> <span class="o">=</span> <span class="n">try</span><span class="o">?</span> <span class="n">container</span><span class="p">.</span><span class="n">decode</span><span class="p">(</span><span class="n">Empty</span><span class="p">.</span><span class="nb">self</span><span class="p">)</span>
</span><span class='line'>            <span class="p">}</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>This way, we simply add <code>@IgnoreUnknown</code> before our available seasons and voilà! After that, the <code>available</code> array simply skips the values it cannot understand 🚀</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='swift'><span class='line'><span class="k">struct</span> <span class="nl">Seasons</span><span class="p">:</span> <span class="n">Decodable</span> <span class="p">{</span>
</span><span class='line'>    <span class="p">@</span><span class="n">IgnoreUnknown</span>
</span><span class='line'>    <span class="k">var</span> <span class="nl">available</span><span class="p">:</span> <span class="p">[</span><span class="n">Season</span><span class="p">]</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Property Wrappers come with a lot of other great use cases. Please see <a href="https://docs.swift.org/swift-book/LanguageGuide/Properties.html">Properties</a> in Apple documentation for more details 🙂</p>

<p>Hope this blogpost was helpful, thanks for reading!</p>
]]></content>
    
  </entry>
  
  <entry>
    
    <title type="html"><![CDATA[Complete flows, partial models]]></title>
    <link href="http://nshint.github.io/blog/2019/07/13/complete-flows-partial-models/"/>
    
    <updated>2019-07-13T19:55:56+02:00</updated>
    <id>http://nshint.github.io/blog/2019/07/13/complete-flows-partial-models</id>
    
    <content type="html"><![CDATA[<p>Most apps these days have a sequence of screens that gather information from the user, like a registration flow, a form of some kind. The data from each step is typically combined into a single data structure.
For example, let&rsquo;s say we want the name, age, and the password to authenticate the user.</p>

<!--more-->


<p>One way to model it is by using the following data structure:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='swift'><span class='line'><span class="k">struct</span> <span class="n">FormData</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">let</span> <span class="nl">name</span><span class="p">:</span> <span class="n">String</span>
</span><span class='line'>    <span class="k">let</span> <span class="nl">age</span><span class="p">:</span> <span class="n">Int</span>
</span><span class='line'>    <span class="k">let</span> <span class="nl">password</span><span class="p">:</span> <span class="n">String</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>One issue we are going to come about is that our model is strict, it needs all the values at once, whereas users will supply each value at a time. First they will type in their name, then their age, and so on.
Wrapping up the fields in <code>Optional</code>, may loosen its strictness.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='swift'><span class='line'><span class="k">struct</span> <span class="n">FormData</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">let</span> <span class="nl">name</span><span class="p">:</span> <span class="n">String</span><span class="o">?</span>
</span><span class='line'>    <span class="k">let</span> <span class="nl">age</span><span class="p">:</span> <span class="n">Int</span><span class="o">?</span>
</span><span class='line'>    <span class="k">let</span> <span class="nl">password</span><span class="p">:</span> <span class="n">String</span><span class="o">?</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Our flow code might look like:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
</pre></td><td class='code'><pre><code class='swift'><span class='line'><span class="k">func</span> <span class="nf">firstStepFinished</span><span class="p">(</span><span class="n">with</span> <span class="nl">name</span><span class="p">:</span> <span class="n">String</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">FormData</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">FormData</span><span class="p">(</span><span class="nl">name</span><span class="p">:</span> <span class="n">name</span><span class="p">,</span> <span class="nl">age</span><span class="p">:</span> <span class="nb">nil</span><span class="p">,</span> <span class="nl">password</span><span class="p">:</span> <span class="nb">nil</span><span class="p">)</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">func</span> <span class="n">secondStepFinished</span><span class="p">(</span><span class="n">with</span> <span class="nl">age</span><span class="p">:</span> <span class="n">Int</span><span class="p">,</span> <span class="nl">partialFormData</span><span class="p">:</span> <span class="n">FormData</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">FormData</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">FormData</span><span class="p">(</span><span class="nl">name</span><span class="p">:</span> <span class="n">partialFormData</span><span class="p">.</span><span class="n">name</span><span class="p">,</span> <span class="nl">age</span><span class="p">:</span> <span class="n">age</span><span class="p">,</span> <span class="nl">password</span><span class="p">:</span> <span class="nb">nil</span><span class="p">)</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">func</span> <span class="n">thirdStepFinished</span><span class="p">(</span><span class="n">with</span> <span class="nl">password</span><span class="p">:</span> <span class="n">String</span><span class="p">,</span> <span class="nl">partialFormData</span><span class="p">:</span> <span class="n">FormData</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">let</span> <span class="n">formData</span> <span class="o">=</span> <span class="n">FormData</span><span class="p">(</span><span class="nl">name</span><span class="p">:</span> <span class="n">partialFormData</span><span class="p">.</span><span class="n">name</span><span class="p">,</span> <span class="nl">age</span><span class="p">:</span> <span class="n">partialFormData</span><span class="p">.</span><span class="n">age</span><span class="p">,</span> <span class="nl">password</span><span class="p">:</span> <span class="n">password</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">api</span><span class="p">.</span><span class="n">performLogin</span><span class="p">(</span><span class="nl">with</span><span class="p">:</span> <span class="n">formData</span><span class="p">)</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>However, now we need to <code>guard</code> against any <code>nil</code> values if we want to use them (for example, to make a network request).</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='swift'><span class='line'><span class="n">guard</span> <span class="k">let</span> <span class="n">name</span> <span class="o">=</span> <span class="n">formData</span><span class="p">.</span><span class="n">name</span><span class="p">,</span>
</span><span class='line'>      <span class="k">let</span> <span class="n">age</span> <span class="o">=</span> <span class="n">formData</span><span class="p">.</span><span class="n">age</span><span class="p">,</span>
</span><span class='line'>      <span class="k">let</span> <span class="n">password</span> <span class="o">=</span> <span class="n">formData</span><span class="p">.</span><span class="n">password</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="c1">// what should we do here???</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// use data</span>
</span></code></pre></td></tr></table></div></figure>


<p>From a domain perspective, that <code>return</code> doesn&rsquo;t make any sense.</p>

<p>One could argue that it&rsquo;s &ldquo;safe&rdquo; to force unwrap in this case, or that there is <a href="https://www.swiftbysundell.com/posts/handling-non-optional-optionals-in-swift">already a nice approach to this problem</a>.</p>

<p>One may say, <em>&ldquo;we can raise an error to the user&rdquo;</em> or <em>&ldquo;we could track it and check if users are getting stuck somehow&rdquo;</em>. But, at the end of the day, this is not a good solution because you know that when the flow ends, you have all the values.</p>

<p>Our model is &ldquo;lying&rdquo; to us. That&rsquo;s not loosen, it&rsquo;s just flawed.</p>

<p>There are several approaches to make it better, like &ldquo;one model per step&rdquo;:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
</pre></td><td class='code'><pre><code class='swift'><span class='line'><span class="k">struct</span> <span class="n">FirstStep</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">let</span> <span class="nl">name</span><span class="p">:</span> <span class="n">String</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">struct</span> <span class="n">SecondStep</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">let</span> <span class="nl">name</span><span class="p">:</span> <span class="n">String</span>
</span><span class='line'>    <span class="k">let</span> <span class="nl">age</span><span class="p">:</span> <span class="n">Int</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">init</span><span class="p">(</span><span class="nl">firstStep</span><span class="p">:</span> <span class="n">FirstStep</span><span class="p">,</span> <span class="nl">age</span><span class="p">:</span> <span class="n">Int</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="nb">self</span><span class="p">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">firstStep</span><span class="p">.</span><span class="n">name</span>
</span><span class='line'>        <span class="nb">self</span><span class="p">.</span><span class="n">age</span> <span class="o">=</span> <span class="n">age</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">struct</span> <span class="n">ThirdStep</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">let</span> <span class="nl">name</span><span class="p">:</span> <span class="n">String</span>
</span><span class='line'>    <span class="k">let</span> <span class="nl">age</span><span class="p">:</span> <span class="n">Int</span>
</span><span class='line'>    <span class="k">let</span> <span class="nl">password</span><span class="p">:</span> <span class="n">String</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">init</span><span class="p">(</span><span class="nl">secondStep</span><span class="p">:</span> <span class="n">SecondStep</span><span class="p">,</span> <span class="nl">password</span><span class="p">:</span> <span class="n">String</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="nb">self</span><span class="p">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">secondStep</span><span class="p">.</span><span class="n">name</span>
</span><span class='line'>        <span class="nb">self</span><span class="p">.</span><span class="n">age</span> <span class="o">=</span> <span class="n">secondStep</span><span class="p">.</span><span class="n">age</span>
</span><span class='line'>        <span class="nb">self</span><span class="p">.</span><span class="n">password</span> <span class="o">=</span> <span class="n">password</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>That&rsquo;s better! But there is also another way of doing things that doesn&rsquo;t involve duplication nor partial data structs.</p>

<p>Instead of breaking down our data structure, why not to break down functions?</p>

<p>Our <code>FormData</code> initializer, when interpreted as a function, has this shape:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='swift'><span class='line'><span class="p">(</span><span class="n">String</span><span class="p">,</span> <span class="n">Int</span><span class="p">,</span> <span class="n">String</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">FormData</span>
</span></code></pre></td></tr></table></div></figure>


<p>But we can break it down into plain old lambdas<sup id="fnref:1"><a href="#fn:1" rel="footnote">1</a></sup>, and by applying it to the initializer for our data structure:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='swift'><span class='line'><span class="p">(</span><span class="n">String</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="p">(</span><span class="n">Int</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="p">(</span><span class="n">String</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">FormData</span>
</span></code></pre></td></tr></table></div></figure>


<p>This technique is called <a href="https://www.pointfree.co/episodes/ep5-higher-order-functions#t42">currying</a>. What it does is, it allow us to translate the evaluation of a function that takes multiple arguments into evaluating a sequence of functions, each with a single argument.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='swift'><span class='line'><span class="k">func</span> <span class="n">curry</span><span class="o">&lt;</span><span class="n">A</span><span class="p">,</span> <span class="n">B</span><span class="p">,</span> <span class="n">C</span><span class="p">,</span> <span class="n">D</span><span class="o">&gt;</span><span class="p">(</span>
</span><span class='line'>    <span class="n">_</span> <span class="nl">f</span><span class="p">:</span> <span class="p">@</span><span class="n">escaping</span> <span class="p">(</span><span class="n">A</span><span class="p">,</span> <span class="n">B</span><span class="p">,</span> <span class="n">C</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">D</span>
</span><span class='line'><span class="p">)</span> <span class="o">-&gt;</span> <span class="p">(</span><span class="n">A</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="p">(</span><span class="n">B</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="p">(</span><span class="n">C</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">D</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="p">{</span> <span class="n">a</span> <span class="k">in</span> <span class="p">{</span> <span class="n">b</span> <span class="k">in</span> <span class="p">{</span> <span class="n">c</span> <span class="k">in</span> <span class="k">return</span> <span class="n">f</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span><span class="p">)</span> <span class="p">}</span> <span class="p">}</span> <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>The function above goes from a function that takes multiple arguments <code>(A, B, C)</code> and produces a <code>D</code>, to single functions, that take one argument each: <code>(A) -&gt; (B) -&gt; (C)</code> and produces a <code>D</code>, making it possible to partially apply each argument, one at the time, until it can evaluate and return the output value.</p>

<p>Using it in our flow, may look like the following:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
</pre></td><td class='code'><pre><code class='swift'><span class='line'><span class="k">typealias</span> <span class="n">Name</span> <span class="o">=</span> <span class="n">String</span>
</span><span class='line'><span class="k">typealias</span> <span class="n">Age</span> <span class="o">=</span> <span class="n">Int</span>
</span><span class='line'><span class="k">typealias</span> <span class="n">Password</span> <span class="o">=</span> <span class="n">String</span>
</span><span class='line'>
</span><span class='line'><span class="k">typealias</span> <span class="n">FromFirstStep</span> <span class="o">=</span> <span class="p">(</span><span class="n">Age</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="p">(</span><span class="n">Password</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">FormData</span>
</span><span class='line'><span class="k">typealias</span> <span class="n">FromSecondStep</span> <span class="o">=</span> <span class="p">(</span><span class="n">Password</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">FormData</span>
</span><span class='line'>
</span><span class='line'><span class="k">func</span> <span class="n">firstStepFinished</span><span class="p">(</span><span class="n">with</span> <span class="nl">name</span><span class="p">:</span> <span class="n">String</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">FromFirstStep</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">let</span> <span class="n">curried</span> <span class="o">=</span> <span class="n">curry</span><span class="p">(</span><span class="n">FormData</span><span class="p">.</span><span class="k">init</span><span class="p">)</span> <span class="c1">// (Name) -&gt; (Age) -&gt; (Password) -&gt; FormData</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">curried</span><span class="p">(</span><span class="n">name</span><span class="p">)</span> <span class="c1">// (Age) -&gt; (Password) -&gt; FormData</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">func</span> <span class="n">secondStepFinished</span><span class="p">(</span><span class="n">with</span> <span class="nl">age</span><span class="p">:</span> <span class="n">Int</span><span class="p">,</span> <span class="nl">partialData</span><span class="p">:</span> <span class="n">FromFirstStep</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">FromSecondStep</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">partialData</span><span class="p">(</span><span class="n">age</span><span class="p">)</span> <span class="c1">// (Password) -&gt; FormData</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">func</span> <span class="n">thirdStepFinished</span><span class="p">(</span><span class="n">with</span> <span class="nl">password</span><span class="p">:</span> <span class="n">String</span><span class="p">,</span> <span class="nl">partialData</span><span class="p">:</span> <span class="n">FromSecondStep</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">let</span> <span class="n">formData</span> <span class="o">=</span> <span class="n">partialData</span><span class="p">(</span><span class="n">password</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">api</span><span class="p">.</span><span class="n">performLogin</span><span class="p">(</span><span class="nl">with</span><span class="p">:</span> <span class="n">formData</span><span class="p">)</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>I&rsquo;ve added a few <code>type aliases</code> just to make it more readable.
Cleaning up them further, we&rsquo;ll have:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='swift'><span class='line'><span class="k">typealias</span> <span class="n">FromThirdStep</span> <span class="o">=</span> <span class="n">FormData</span> <span class="c1">// just to be explicit</span>
</span><span class='line'><span class="k">typealias</span> <span class="n">FromSecondStep</span> <span class="o">=</span> <span class="p">(</span><span class="n">Password</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">FromThirdStep</span>
</span><span class='line'><span class="k">typealias</span> <span class="n">FromFirstStep</span> <span class="o">=</span> <span class="p">(</span><span class="n">Age</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">FromSecondStep</span>
</span></code></pre></td></tr></table></div></figure>


<p>If you ask me, this is much better because we didn&rsquo;t have to write anything else, other than the <code>curry</code><sup id="fnref:2"><a href="#fn:2" rel="footnote">2</a></sup> function itself, which can be used in other places.</p>

<p>And that&rsquo;s it! Functions have saved the day :)</p>

<p>P.S: I want to thank <a href="https://twitter.com/__chefski__">Sean Olszewski</a>, <a href="https://twitter.com/gfontenot">Gordon Fontenot</a>, <a href="https://github.com/peter-tomaselli">Peter Tomaselli</a>, <a href="https://twitter.com/morbin_">Henrique Morbin</a>, <a href="https://twitter.com/mwgobetti">Marcelo Gobetti</a> and <a href="https://github.com/joaortk">João Rutkoski</a> for their awesome review.</p>
<div class="footnotes">
<hr/>
<ol>
<li id="fn:1">
<p><code>functions take one argument and return one result.</code> From the book: <a href="http://haskellbook.com/"><code>Haskell Programming from First Principles</code></a><a href="#fnref:1" rev="footnote">&#8617;</a></p></li>
<li id="fn:2">
<p>Or just use the <a href="https://github.com/thoughtbot/Curry">Curry.framework</a><a href="#fnref:2" rev="footnote">&#8617;</a></p></li>
</ol>
</div>

]]></content>
    
  </entry>
  
  <entry>
    
    <title type="html"><![CDATA[Testing Codable]]></title>
    <link href="http://nshint.github.io/blog/2019/05/10/testing-codable/"/>
    
    <updated>2019-05-10T19:55:56+02:00</updated>
    <id>http://nshint.github.io/blog/2019/05/10/testing-codable</id>
    
    <content type="html"><![CDATA[<p>Codable is a great protocol available in Swift. It makes it possible to create a type safe JSON representations of structures used within our application with zero boilerplate.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='swift'><span class='line'><span class="k">struct</span> <span class="nl">Person</span><span class="p">:</span> <span class="n">Codable</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">let</span> <span class="nl">name</span><span class="p">:</span> <span class="n">String</span>
</span><span class='line'>    <span class="k">let</span> <span class="nl">email</span><span class="p">:</span> <span class="n">String</span>
</span><span class='line'>    <span class="k">let</span> <span class="nl">age</span><span class="p">:</span> <span class="n">Int</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Once the structure conforms to <code>Codable</code> everything works out of the box. There&rsquo;s a nice way to test those structures and make sure that everything gets the exact JSON format that we aligned with backend.</p>

<!--more-->


<p>Let&rsquo;s create the following protocol in the test bundle:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='swift'><span class='line'><span class="k">protocol</span> <span class="n">JSONTestable</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">init</span><span class="o">?</span><span class="p">(</span><span class="n">_</span> <span class="nl">json</span><span class="p">:</span> <span class="n">String</span><span class="p">)</span>
</span><span class='line'>    <span class="k">func</span> <span class="n">json</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="n">String</span><span class="o">?</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>After that we can immediately provide an extension which conforms to that protocol in the test bundle:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='swift'><span class='line'><span class="k">extension</span> <span class="n">JSONTestable</span> <span class="k">where</span> <span class="nl">Self</span><span class="p">:</span> <span class="n">Codable</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">init</span><span class="o">?</span><span class="p">(</span><span class="n">_</span> <span class="nl">json</span><span class="p">:</span> <span class="n">String</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="n">guard</span>
</span><span class='line'>            <span class="k">let</span> <span class="n">data</span> <span class="o">=</span> <span class="n">json</span><span class="p">.</span><span class="n">data</span><span class="p">(</span><span class="nl">using</span><span class="p">:</span> <span class="p">.</span><span class="n">utf8</span><span class="p">),</span>
</span><span class='line'>            <span class="k">let</span> <span class="n">decoded</span> <span class="o">=</span> <span class="n">try</span><span class="o">?</span> <span class="n">JSONDecoder</span><span class="p">().</span><span class="n">decode</span><span class="p">(</span><span class="kt">Self</span><span class="p">.</span><span class="nb">self</span><span class="p">,</span> <span class="nl">from</span><span class="p">:</span> <span class="n">data</span><span class="p">)</span>
</span><span class='line'>            <span class="k">else</span> <span class="p">{</span> <span class="k">return</span> <span class="nb">nil</span> <span class="p">}</span>
</span><span class='line'>        <span class="nb">self</span> <span class="o">=</span> <span class="n">decoded</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">func</span> <span class="n">json</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="n">String</span><span class="o">?</span> <span class="p">{</span>
</span><span class='line'>        <span class="n">guard</span> <span class="k">let</span> <span class="n">data</span> <span class="o">=</span> <span class="n">try</span><span class="o">?</span> <span class="n">JSONEncoder</span><span class="p">().</span><span class="n">encode</span><span class="p">(</span><span class="nb">self</span><span class="p">)</span> <span class="k">else</span> <span class="p">{</span> <span class="k">return</span> <span class="nb">nil</span> <span class="p">}</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">String</span><span class="p">(</span><span class="nl">data</span><span class="p">:</span> <span class="n">data</span><span class="p">,</span> <span class="nl">encoding</span><span class="p">:</span> <span class="p">.</span><span class="n">utf8</span><span class="p">)</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Then there&rsquo;s only one simple step which needs to be done in the test bundle in order to test the structure:
<code>PersonTests.swift</code>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='swift'><span class='line'><span class="k">extension</span> <span class="nl">Person</span><span class="p">:</span> <span class="n">JSONTestable</span> <span class="p">{}</span>
</span></code></pre></td></tr></table></div></figure>


<p>That&rsquo;s it! Now we can easily test the result of the serialization and deserialization :)</p>

<p>Example tests:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class='swift'><span class='line'><span class="n">final</span> <span class="k">class</span> <span class="nl">PersonTests</span><span class="p">:</span> <span class="n">XCTestCase</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">func</span> <span class="n">testJsonSerialization</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">let</span> <span class="n">person</span> <span class="o">=</span> <span class="n">Person</span><span class="p">(</span><span class="nl">name</span><span class="p">:</span> <span class="s">&quot;John Appleased&quot;</span><span class="p">,</span> <span class="nl">email</span><span class="p">:</span> <span class="s">&quot;john@appleased.com&quot;</span><span class="p">,</span> <span class="nl">age</span><span class="p">:</span> <span class="mi">30</span><span class="p">)</span>
</span><span class='line'>        <span class="n">XCTAssertEqual</span><span class="p">(</span><span class="n">personJson</span><span class="p">,</span> <span class="n">person</span><span class="p">.</span><span class="n">json</span><span class="p">())</span> <span class="c1">// ✅</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">func</span> <span class="n">testJsonDeserialization</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">let</span> <span class="n">person</span> <span class="o">=</span> <span class="n">Person</span><span class="p">(</span><span class="nl">name</span><span class="p">:</span> <span class="s">&quot;John Appleased&quot;</span><span class="p">,</span> <span class="nl">email</span><span class="p">:</span> <span class="s">&quot;john@appleased.com&quot;</span><span class="p">,</span> <span class="nl">age</span><span class="p">:</span> <span class="mi">30</span><span class="p">)</span>
</span><span class='line'>        <span class="n">XCTAssertEqual</span><span class="p">(</span><span class="n">person</span><span class="p">,</span> <span class="n">Person</span><span class="p">(</span><span class="n">personJson</span><span class="p">))</span> <span class="c1">// ✅</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="n">private</span> <span class="k">let</span> <span class="n">personJson</span> <span class="o">=</span> <span class="s">&quot;&quot;&quot;</span>
</span><span class='line'><span class="p">{</span><span class="s">&quot;name&quot;</span><span class="o">:</span><span class="s">&quot;John Appleased&quot;</span><span class="p">,</span><span class="s">&quot;email&quot;</span><span class="o">:</span><span class="s">&quot;john@appleased.com&quot;</span><span class="p">,</span><span class="s">&quot;age&quot;</span><span class="o">:</span><span class="mi">30</span><span class="p">}</span>
</span><span class='line'><span class="s">&quot;&quot;&quot;</span>
</span><span class='line'>
</span><span class='line'><span class="k">extension</span> <span class="nl">Person</span><span class="p">:</span> <span class="n">JSONTestable</span><span class="p">,</span> <span class="n">Equatable</span> <span class="p">{}</span>
</span></code></pre></td></tr></table></div></figure>


<p>What do you think about this method? Is there anything which could be improved in this implementation? Please let us know :)</p>
]]></content>
    
  </entry>
  
  <entry>
    
    <title type="html"><![CDATA[Testing the camera on the simulator]]></title>
    <link href="http://nshint.github.io/blog/2019/04/08/testing-the-camera-on-the-simulator/"/>
    
    <updated>2019-04-08T22:36:49+02:00</updated>
    <id>http://nshint.github.io/blog/2019/04/08/testing-the-camera-on-the-simulator</id>
    
    <content type="html"><![CDATA[<p>Testing code often demands faking the &ldquo;real world&rdquo;. <a href="https://en.wikipedia.org/wiki/Inversion_of_control">IoC</a> plays a huge role in here where you flip the dependency from a concrete implementation to an interface.</p>

<p>This technique is very useful when you want to abstract away third-party code (think <code>UserDefaults</code>), but there are instances where this is not enough. That&rsquo;s the case when working with the camera.</p>

<p>On iOS, to use the camera, one has to use the machinery that comes with  <a href="https://developer.apple.com/documentation/avfoundation/cameras_and_media_capture"><code>AVFoundation</code></a>.</p>

<!--more-->


<p>Although you can use <code>protocols</code> to generalize the real objects, at some point, you are going to stumble upon a dilemma: the simulator doesn&rsquo;t have a camera, and you can&rsquo;t instantiate the framework classes making the tests (almost) impossible.</p>

<h4>What are you talking about?</h4>

<p>Let&rsquo;s start with a very simple program that captures QR Code (I&rsquo;m skipping lots of boilerplate but if you are looking for a more thorough example, <a href="https://www.hackingwithswift.com/example-code/media/how-to-scan-a-qr-code">here</a> you have a great article).</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
</pre></td><td class='code'><pre><code class='swift'><span class='line'><span class="k">enum</span> <span class="nl">CameraError</span><span class="p">:</span> <span class="n">Error</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">case</span> <span class="n">invalidMetadata</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">protocol</span> <span class="nl">CameraOutputDelegate</span><span class="p">:</span> <span class="k">class</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">func</span> <span class="n">qrCode</span><span class="p">(</span><span class="n">read</span> <span class="nl">code</span><span class="p">:</span> <span class="n">String</span><span class="p">)</span>
</span><span class='line'>    <span class="k">func</span> <span class="n">qrCode</span><span class="p">(</span><span class="n">failed</span> <span class="nl">error</span><span class="p">:</span> <span class="n">CameraError</span><span class="p">)</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="n">final</span> <span class="k">class</span> <span class="nl">Camera</span><span class="p">:</span> <span class="bp">NSObject</span> <span class="p">{</span>
</span><span class='line'>    <span class="n">private</span> <span class="k">let</span> <span class="nl">session</span><span class="p">:</span> <span class="bp">AVCaptureSession</span>
</span><span class='line'>    <span class="n">private</span> <span class="k">let</span> <span class="nl">metadataOutput</span><span class="p">:</span> <span class="bp">AVCaptureMetadataOutput</span>
</span><span class='line'>    <span class="n">private</span> <span class="k">weak</span> <span class="k">var</span> <span class="nl">delegate</span><span class="p">:</span> <span class="n">CameraOutputDelegate</span><span class="o">?</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">public</span> <span class="k">init</span><span class="p">(</span>
</span><span class='line'>        <span class="nl">session</span><span class="p">:</span> <span class="bp">AVCaptureSession</span> <span class="o">=</span> <span class="bp">AVCaptureSession</span><span class="p">(),</span>
</span><span class='line'>        <span class="nl">metadataOutput</span><span class="p">:</span> <span class="bp">AVCaptureMetadataOutput</span> <span class="o">=</span> <span class="bp">AVCaptureMetadataOutput</span><span class="p">(),</span>
</span><span class='line'>        <span class="nl">delegate</span><span class="p">:</span> <span class="n">CameraOutputDelegate</span><span class="o">?</span>
</span><span class='line'>    <span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="nb">self</span><span class="p">.</span><span class="n">session</span> <span class="o">=</span> <span class="n">session</span>
</span><span class='line'>        <span class="nb">self</span><span class="p">.</span><span class="n">metadataOutput</span> <span class="o">=</span> <span class="n">metadataOutput</span>
</span><span class='line'>
</span><span class='line'>        <span class="nb">super</span><span class="p">.</span><span class="k">init</span><span class="p">()</span>
</span><span class='line'>
</span><span class='line'>        <span class="nb">self</span><span class="p">.</span><span class="n">metadataOutput</span><span class="p">.</span><span class="n">setMetadataObjectsDelegate</span><span class="p">(</span><span class="nb">self</span><span class="p">,</span> <span class="nl">queue</span><span class="p">:</span> <span class="p">.</span><span class="n">main</span><span class="p">)</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">extension</span> <span class="nl">Camera</span><span class="p">:</span> <span class="bp">AVCaptureMetadataOutputObjectsDelegate</span> <span class="p">{</span>
</span><span class='line'>    <span class="n">public</span> <span class="k">func</span> <span class="n">metadataOutput</span><span class="p">(</span>
</span><span class='line'>        <span class="n">_</span> <span class="nl">output</span><span class="p">:</span> <span class="bp">AVCaptureMetadataOutput</span><span class="p">,</span>
</span><span class='line'>        <span class="n">didOutput</span> <span class="nl">metadataObjects</span><span class="p">:</span> <span class="p">[</span><span class="bp">AVMetadataObject</span><span class="p">],</span>
</span><span class='line'>        <span class="n">from</span> <span class="nl">connection</span><span class="p">:</span> <span class="bp">AVCaptureConnection</span>
</span><span class='line'>    <span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="n">guard</span> <span class="k">let</span> <span class="n">object</span> <span class="o">=</span> <span class="n">metadataObjects</span><span class="p">.</span><span class="n">first</span> <span class="kt">as</span><span class="o">?</span> <span class="bp">AVMetadataMachineReadableCodeObject</span><span class="p">,</span>
</span><span class='line'>              <span class="k">let</span> <span class="n">code</span> <span class="o">=</span> <span class="n">object</span><span class="p">.</span><span class="n">stringValue</span><span class="p">,</span> <span class="n">object</span><span class="p">.</span><span class="n">type</span> <span class="o">==</span> <span class="p">.</span><span class="n">qr</span> <span class="k">else</span> <span class="p">{</span>
</span><span class='line'>                <span class="n">delegate</span><span class="o">?</span><span class="p">.</span><span class="n">qrCode</span><span class="p">(</span><span class="nl">failed</span><span class="p">:</span> <span class="p">.</span><span class="n">invalidMetadata</span><span class="p">)</span>
</span><span class='line'>                <span class="k">return</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>        <span class="n">delegate</span><span class="o">?</span><span class="p">.</span><span class="n">qrCode</span><span class="p">(</span><span class="nl">read</span><span class="p">:</span> <span class="n">code</span><span class="p">)</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>When the detection happens, you can compute from framework-provided values, by implementing the following method from <a href="https://developer.apple.com/documentation/avfoundation/avcapturemetadataoutputobjectsdelegate/1389481-metadataoutput"><code>AVCaptureMetadataOutputObjectsDelegate</code></a>. Say we want to exercise our program in a way that we ensure that the <code>CameraOutputDelegate</code> methods are properly called, given what <code>AVFoundation</code> provides.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
</pre></td><td class='code'><pre><code class='swift'><span class='line'><span class="n">final</span> <span class="k">class</span> <span class="nl">CameraOutputSpy</span><span class="p">:</span> <span class="n">CameraOutputDelegate</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">var</span> <span class="nl">qrCodeReadCalled</span><span class="p">:</span> <span class="n">Bool</span><span class="o">?</span>
</span><span class='line'>    <span class="k">var</span> <span class="nl">qrCodePassed</span><span class="p">:</span> <span class="n">String</span><span class="o">?</span>
</span><span class='line'>    <span class="k">var</span> <span class="nl">qrCodeFailedCalled</span><span class="p">:</span> <span class="n">Bool</span><span class="o">?</span>
</span><span class='line'>    <span class="k">var</span> <span class="nl">qrCodeErrorPassed</span><span class="p">:</span> <span class="n">CameraError</span><span class="o">?</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">func</span> <span class="n">qrCode</span><span class="p">(</span><span class="n">read</span> <span class="nl">code</span><span class="p">:</span> <span class="n">String</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="n">qrCodeReadCalled</span> <span class="o">=</span> <span class="nb">true</span>
</span><span class='line'>        <span class="n">qrCodePassed</span> <span class="o">=</span> <span class="n">code</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="k">func</span> <span class="n">qrCode</span><span class="p">(</span><span class="n">failed</span> <span class="nl">error</span><span class="p">:</span> <span class="n">CameraError</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="n">qrCodeFailedCalled</span> <span class="o">=</span> <span class="nb">true</span>
</span><span class='line'>        <span class="n">qrCodeErrorPassed</span> <span class="o">=</span> <span class="n">error</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">let</span> <span class="n">delegate</span> <span class="o">=</span> <span class="n">CameraOutputSpy</span><span class="p">()</span>
</span><span class='line'>
</span><span class='line'><span class="k">let</span> <span class="n">camera</span> <span class="o">=</span> <span class="n">Camera</span><span class="p">(</span>
</span><span class='line'>    <span class="nl">session</span><span class="p">:</span> <span class="bp">AVCaptureSession</span><span class="p">(),</span>
</span><span class='line'>    <span class="nl">metadataOutput</span><span class="p">:</span> <span class="bp">AVCaptureMetadataOutput</span><span class="p">(),</span>
</span><span class='line'>    <span class="nl">delegate</span><span class="p">:</span> <span class="n">delegate</span>
</span><span class='line'><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="n">camera</span><span class="p">.</span><span class="n">metadataOutput</span><span class="p">(</span>
</span><span class='line'>    <span class="bp">AVCaptureMetadataOutput</span><span class="p">(),</span>
</span><span class='line'>    <span class="nl">didOutput</span><span class="p">:</span> <span class="p">[</span><span class="bp">AVMetadataMachineReadableCodeObject</span><span class="p">()],</span> <span class="c1">// error: &#39;init()&#39; is unavailable</span>
</span><span class='line'>    <span class="nl">from</span><span class="p">:</span> <span class="bp">AVCaptureConnection</span><span class="p">()</span> <span class="c1">//error: &#39;init()&#39; is unavailable</span>
</span><span class='line'><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>Waat!?</p>

<p>The problem here is that all of these classes are concrete, so we can&rsquo;t abstract them into an interface. Also they are supposed to be created and populated at runtime, hence you can&rsquo;t <code>init</code> them.</p>

<h4>🍸 <code>Swizzle</code> to the rescue</h4>

<p>One possible solution for this kind of scenario (since the framework it&rsquo;s all <code>Objective-C</code>&hellip;for now at least), is to use the <a href="https://nshipster.com/method-swizzling/"><code>Objective-C</code> runtime shenanigans</a> to &ldquo;fill this gap&rdquo;.</p>

<p>This is only possible because in <code>Objective-C</code> the method to call when a message is sent to an object is resolved at runtime.</p>

<p>I&rsquo;m not going to lay down the nitty-gritty details about how it works, but the main idea (for the sake of this example) is to, at runtime, copy the implementation of <code>NSObject.init</code> and exchange it with some new fake <code>init</code> we are going to create.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
</pre></td><td class='code'><pre><code class='swift'><span class='line'><span class="k">struct</span> <span class="n">Swizzler</span> <span class="p">{</span>
</span><span class='line'>    <span class="n">private</span> <span class="k">let</span> <span class="nl">klass</span><span class="p">:</span> <span class="n">AnyClass</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">init</span><span class="p">(</span><span class="n">_</span> <span class="nl">klass</span><span class="p">:</span> <span class="n">AnyClass</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="nb">self</span><span class="p">.</span><span class="n">klass</span> <span class="o">=</span> <span class="n">klass</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">func</span> <span class="n">injectNSObjectInit</span><span class="p">(</span><span class="n">into</span> <span class="nl">selector</span><span class="p">:</span> <span class="n">Selector</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">let</span> <span class="n">original</span> <span class="o">=</span> <span class="p">[</span>
</span><span class='line'>            <span class="n">class_getInstanceMethod</span><span class="p">(</span><span class="n">klass</span><span class="p">,</span> <span class="n">selector</span><span class="p">)</span>
</span><span class='line'>        <span class="p">].</span><span class="n">compactMap</span> <span class="p">{</span> <span class="err">$</span><span class="mi">0</span> <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">let</span> <span class="n">swizzled</span> <span class="o">=</span> <span class="p">[</span>
</span><span class='line'>            <span class="n">class_getInstanceMethod</span><span class="p">(</span><span class="n">klass</span><span class="p">,</span> <span class="err">#</span><span class="n">selector</span><span class="p">(</span><span class="bp">NSObject</span><span class="p">.</span><span class="k">init</span><span class="p">))</span>
</span><span class='line'>        <span class="p">].</span><span class="n">compactMap</span> <span class="p">{</span> <span class="err">$</span><span class="mi">0</span> <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>        <span class="n">zip</span><span class="p">(</span><span class="n">original</span><span class="p">,</span> <span class="n">swizzled</span><span class="p">)</span>
</span><span class='line'>            <span class="p">.</span><span class="n">forEach</span> <span class="p">{</span>
</span><span class='line'>                <span class="n">method_setImplementation</span><span class="p">(</span><span class="err">$</span><span class="mf">0.0</span><span class="p">,</span> <span class="n">method_getImplementation</span><span class="p">(</span><span class="err">$</span><span class="mf">0.1</span><span class="p">))</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>With that in hand, now we can:</p>

<ol>
<li>Create a <code>private init</code> that will hold the implemetation of <code>NSObject.init</code>.</li>
<li>Create our &ldquo;designated initializer&rdquo;, capturing the parameters our test needs.</li>
<li>Do the swizzle dance.</li>
</ol>


<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
</pre></td><td class='code'><pre><code class='swift'><span class='line'><span class="n">final</span> <span class="k">class</span> <span class="nl">FakeMachineReadableCodeObject</span><span class="p">:</span> <span class="bp">AVMetadataMachineReadableCodeObject</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">var</span> <span class="nl">code</span><span class="p">:</span> <span class="n">String</span><span class="o">?</span>
</span><span class='line'>    <span class="k">var</span> <span class="nl">dataType</span><span class="p">:</span> <span class="bp">AVMetadataObject</span><span class="p">.</span><span class="n">ObjectType</span> <span class="o">=</span> <span class="p">.</span><span class="n">qr</span>
</span><span class='line'>
</span><span class='line'>    <span class="kr">override</span> <span class="k">var</span> <span class="nl">stringValue</span><span class="p">:</span> <span class="n">String</span><span class="o">?</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">code</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="kr">override</span> <span class="k">var</span> <span class="nl">type</span><span class="p">:</span> <span class="bp">AVMetadataObject</span><span class="p">.</span><span class="n">ObjectType</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">dataType</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// 1</span>
</span><span class='line'>    <span class="p">@</span><span class="n">objc</span> <span class="n">private</span> <span class="n">convenience</span> <span class="k">init</span><span class="p">(</span><span class="nl">fake</span><span class="p">:</span> <span class="n">String</span><span class="p">)</span> <span class="p">{</span> <span class="n">fatalError</span><span class="p">()</span> <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">private</span> <span class="k">class</span> <span class="k">func</span> <span class="n">fake</span><span class="p">(</span><span class="nl">fake</span><span class="p">:</span> <span class="n">String</span><span class="p">,</span> <span class="nl">type</span><span class="p">:</span> <span class="bp">AVMetadataObject</span><span class="p">.</span><span class="n">ObjectType</span> <span class="o">=</span> <span class="p">.</span><span class="n">qr</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">FakeMachineReadableCodeObject</span><span class="o">?</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">let</span> <span class="n">m</span> <span class="o">=</span> <span class="n">FakeMachineReadableCodeObject</span><span class="p">(</span><span class="nl">fake</span><span class="p">:</span> <span class="n">fake</span><span class="p">)</span>
</span><span class='line'>        <span class="n">m</span><span class="p">.</span><span class="n">code</span> <span class="o">=</span> <span class="n">fake</span>
</span><span class='line'>        <span class="n">m</span><span class="p">.</span><span class="n">dataType</span> <span class="o">=</span> <span class="n">type</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">return</span> <span class="n">m</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// 2</span>
</span><span class='line'>    <span class="k">static</span> <span class="k">func</span> <span class="n">createFake</span><span class="p">(</span><span class="nl">code</span><span class="p">:</span> <span class="n">String</span><span class="p">,</span> <span class="nl">type</span><span class="p">:</span> <span class="bp">AVMetadataObject</span><span class="p">.</span><span class="n">ObjectType</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">FakeMachineReadableCodeObject</span><span class="o">?</span> <span class="p">{</span>
</span><span class='line'>        <span class="c1">// 3</span>
</span><span class='line'>        <span class="n">Swizzler</span><span class="p">(</span><span class="nb">self</span><span class="p">).</span><span class="n">injectNSObjectInit</span><span class="p">(</span><span class="nl">into</span><span class="p">:</span> <span class="err">#</span><span class="n">selector</span><span class="p">(</span><span class="n">FakeMachineReadableCodeObject</span><span class="p">.</span><span class="k">init</span><span class="p">(</span><span class="nl">fake</span><span class="p">:)))</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">fake</span><span class="p">(</span><span class="nl">fake</span><span class="p">:</span> <span class="n">code</span><span class="p">,</span> <span class="nl">type</span><span class="p">:</span> <span class="n">type</span><span class="p">)</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now, we can create a fake QR code payload in our tests and check if your implementation of <code>AVCaptureMetadataOutputObjectsDelegate</code> does what you expect it to.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
</pre></td><td class='code'><pre><code class='swift'><span class='line'><span class="k">let</span> <span class="n">delegate</span> <span class="o">=</span> <span class="n">CameraOutputSpy</span><span class="p">()</span>
</span><span class='line'>
</span><span class='line'><span class="k">let</span> <span class="n">camera</span> <span class="o">=</span> <span class="n">Camera</span><span class="p">(</span>
</span><span class='line'>    <span class="nl">session</span><span class="p">:</span> <span class="bp">AVCaptureSession</span><span class="p">(),</span>
</span><span class='line'>    <span class="nl">metadataOutput</span><span class="p">:</span> <span class="bp">AVCaptureMetadataOutput</span><span class="p">(),</span>
</span><span class='line'>    <span class="nl">delegate</span><span class="p">:</span> <span class="n">delegate</span>
</span><span class='line'><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="n">camera</span><span class="p">.</span><span class="n">metadataOutput</span><span class="p">(</span>
</span><span class='line'>    <span class="n">QRMetadataOutputFake</span><span class="p">(),</span> <span class="c1">// plain ol&#39; subclass, not really important</span>
</span><span class='line'>    <span class="nl">didOutput</span><span class="p">:</span> <span class="p">[</span>
</span><span class='line'>        <span class="n">FakeMachineReadableCodeObject</span><span class="p">.</span><span class="n">createFake</span><span class="p">(</span><span class="nl">code</span><span class="p">:</span> <span class="s">&quot;interleaved2of5 value&quot;</span><span class="p">,</span> <span class="nl">type</span><span class="p">:</span> <span class="p">.</span> <span class="n">interleaved2of5</span><span class="p">)</span><span class="o">!</span>
</span><span class='line'>        <span class="n">FakeMachineReadableCodeObject</span><span class="p">.</span><span class="n">createFake</span><span class="p">(</span><span class="nl">code</span><span class="p">:</span> <span class="s">&quot;QR code value&quot;</span><span class="p">,</span> <span class="nl">type</span><span class="p">:</span> <span class="p">.</span><span class="n">qr</span><span class="p">)</span><span class="o">!</span>
</span><span class='line'>    <span class="p">],</span>
</span><span class='line'>    <span class="nl">from</span><span class="p">:</span> <span class="bp">AVCaptureConnection</span><span class="p">(</span>
</span><span class='line'>        <span class="nl">inputPorts</span><span class="p">:</span> <span class="p">[],</span>
</span><span class='line'>        <span class="nl">output</span><span class="p">:</span> <span class="bp">AVCaptureOutput</span><span class="p">.</span><span class="n">createFake</span><span class="o">!</span> <span class="c1">// Another swizzle</span>
</span><span class='line'>  <span class="p">)</span>
</span><span class='line'><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="n">XCTAssertEqual</span><span class="p">(</span><span class="n">delegate</span><span class="p">.</span><span class="n">qrCodeReadCalled</span><span class="p">,</span> <span class="nb">true</span><span class="p">)</span>
</span><span class='line'><span class="n">XCTAssertEqual</span><span class="p">(</span><span class="n">delegate</span><span class="p">.</span><span class="n">qrCodePassed</span><span class="p">,</span> <span class="s">&quot;QR code value&quot;</span><span class="p">)</span>
</span><span class='line'><span class="n">XCTAssertNil</span><span class="p">(</span><span class="n">delegate</span><span class="p">.</span><span class="n">qrCodeFailedCalled</span><span class="p">)</span>
</span><span class='line'><span class="n">XCTAssertNil</span><span class="p">(</span><span class="n">delegate</span><span class="p">.</span><span class="n">qrCodeErrorPassed</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>As you can see, you can also check if your <a href="https://en.wikipedia.org/wiki/System_under_test"><code>sut</code></a> handles just QR code.</p>

<p>You can use this technique along side with other collaborators, like <code>AVCaptureDevice</code>, <code>AVCaptureInput</code> and <code>AVCaptureOutput</code>.</p>
]]></content>
    
  </entry>
  
  <entry>
    
    <title type="html"><![CDATA[Wrapping API's using the Builder Pattern]]></title>
    <link href="http://nshint.github.io/blog/2016/05/02/wrapping-apis-using-the-builder-pattern/"/>
    
    <updated>2016-05-02T22:36:49+02:00</updated>
    <id>http://nshint.github.io/blog/2016/05/02/wrapping-apis-using-the-builder-pattern</id>
    
    <content type="html"><![CDATA[<p>The way I was introduced to the <a href="http://www.amazon.com/Design-Patterns-Elements-Reusable-Object-Oriented/dp/0201633612">Design Patterns</a> lead me to think that those clever and neat solutions were meant to be used just in big softwares solutions. I never considered using them into the small pieces of software. What do I mean by that? Please, read on.</p>

<p>The Builder Pattern if defined as follows:</p>

<blockquote><p>Separate the construction of a complex object from its representation so that the same construction process can create different representations.</p></blockquote>

<!--more-->


<p>Now, consider for a while the creation of an <code>UIAlertView</code> in iOS.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='swift'><span class='line'><span class="k">let</span> <span class="n">alert</span> <span class="o">=</span> <span class="bp">UIAlertView</span><span class="p">(</span><span class="nl">title</span><span class="p">:</span> <span class="s">&quot;Question&quot;</span><span class="p">,</span> <span class="nl">message</span><span class="p">:</span> <span class="s">&quot;Do you like apples?&quot;</span><span class="p">,</span> <span class="nl">delegate</span><span class="p">:</span> <span class="nb">self</span><span class="p">,</span> <span class="nl">cancelButtonTitle</span><span class="p">:</span> <span class="s">&quot;I hate it!&quot;</span><span class="p">,</span> <span class="nl">otherButtonTitles</span><span class="p">:</span> <span class="s">&quot;Yes, I do!&quot;</span><span class="p">,</span> <span class="s">&quot;More of less&quot;</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>This is a long method call, right? But really, that&rsquo;s not the problem. The problem here is that our class has to conform to <code>UIAlertViewDelegate</code> in order to receive the alert result. Wouldn&rsquo;t be nicer to have that logic encapsulated? Well, go back and read the definition for the builder pattern, it fits like a glove, am I right?</p>

<p>An idea on how to wrap the builder pattern around the <code>UIAlertView</code> class is as above:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
</pre></td><td class='code'><pre><code class='swift'><span class='line'><span class="k">class</span> <span class="nl">AlertBuilder</span><span class="p">:</span> <span class="bp">NSObject</span><span class="p">,</span> <span class="bp">UIAlertViewDelegate</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">typealias</span> <span class="n">AlertBuilderCompletion</span> <span class="o">=</span> <span class="n">Int</span> <span class="o">-&gt;</span> <span class="n">Void</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">private</span> <span class="k">var</span> <span class="nl">alertTitle</span><span class="p">:</span> <span class="n">String</span> <span class="o">=</span> <span class="s">&quot;&quot;</span>
</span><span class='line'>    <span class="n">private</span> <span class="k">var</span> <span class="nl">alertMessage</span><span class="p">:</span> <span class="n">String</span> <span class="o">=</span> <span class="s">&quot;&quot;</span>
</span><span class='line'>    <span class="n">private</span> <span class="k">var</span> <span class="nl">alertStyle</span><span class="p">:</span> <span class="n">UIAlertViewStyle</span> <span class="o">=</span> <span class="p">.</span><span class="n">Default</span>
</span><span class='line'>    <span class="n">private</span> <span class="k">var</span> <span class="nl">alertButtonTitles</span><span class="p">:</span> <span class="p">[</span><span class="n">String</span><span class="p">]</span> <span class="o">=</span> <span class="p">[]</span>
</span><span class='line'>    <span class="n">private</span> <span class="k">var</span> <span class="nl">alertCompletion</span><span class="p">:</span> <span class="n">AlertBuilderCompletion</span><span class="o">?</span> <span class="o">=</span> <span class="nb">nil</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">func</span> <span class="n">title</span><span class="p">(</span><span class="nl">title</span><span class="p">:</span> <span class="n">String</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">AlertBuilder</span> <span class="p">{</span>
</span><span class='line'>        <span class="n">alertTitle</span> <span class="o">=</span> <span class="n">title</span>
</span><span class='line'>        <span class="k">return</span> <span class="nb">self</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">func</span> <span class="n">message</span><span class="p">(</span><span class="nl">message</span><span class="p">:</span> <span class="n">String</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">AlertBuilder</span> <span class="p">{</span>
</span><span class='line'>        <span class="n">alertMessage</span> <span class="o">=</span> <span class="n">message</span>
</span><span class='line'>        <span class="k">return</span> <span class="nb">self</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">func</span> <span class="n">style</span><span class="p">(</span><span class="nl">style</span><span class="p">:</span> <span class="n">UIAlertViewStyle</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">AlertBuilder</span> <span class="p">{</span>
</span><span class='line'>        <span class="n">alertStyle</span> <span class="o">=</span> <span class="n">style</span>
</span><span class='line'>        <span class="k">return</span> <span class="nb">self</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">func</span> <span class="n">buttonTitles</span><span class="p">(</span><span class="nl">titles</span><span class="p">:</span> <span class="n">String</span><span class="p">...)</span> <span class="o">-&gt;</span> <span class="n">AlertBuilder</span> <span class="p">{</span>
</span><span class='line'>        <span class="n">alertButtonTitles</span> <span class="o">=</span> <span class="n">alertButtonTitles</span> <span class="o">+</span> <span class="n">titles</span>
</span><span class='line'>        <span class="k">return</span> <span class="nb">self</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">func</span> <span class="n">show</span><span class="p">(</span><span class="nl">completion</span><span class="p">:</span> <span class="n">AlertBuilderCompletion</span><span class="o">?</span> <span class="o">=</span> <span class="nb">nil</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">let</span> <span class="n">alertView</span> <span class="o">=</span> <span class="bp">UIAlertView</span><span class="p">()</span>
</span><span class='line'>        <span class="n">alertView</span><span class="p">.</span><span class="n">delegate</span> <span class="o">=</span> <span class="nb">self</span>
</span><span class='line'>        <span class="n">alertView</span><span class="p">.</span><span class="n">title</span> <span class="o">=</span> <span class="n">alertTitle</span>
</span><span class='line'>        <span class="n">alertView</span><span class="p">.</span><span class="n">message</span> <span class="o">=</span> <span class="n">alertMessage</span>
</span><span class='line'>        <span class="n">alertView</span><span class="p">.</span><span class="n">alertViewStyle</span> <span class="o">=</span> <span class="n">alertStyle</span>
</span><span class='line'>
</span><span class='line'>        <span class="n">alertButtonTitles</span><span class="p">.</span><span class="n">forEach</span> <span class="p">{</span> <span class="n">title</span> <span class="k">in</span>
</span><span class='line'>            <span class="n">alertView</span><span class="p">.</span><span class="n">addButtonWithTitle</span><span class="p">(</span><span class="n">title</span><span class="p">)</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>        <span class="n">alertCompletion</span> <span class="o">=</span> <span class="n">completion</span>
</span><span class='line'>        <span class="n">alertView</span><span class="p">.</span><span class="n">show</span><span class="p">()</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">func</span> <span class="n">alertView</span><span class="p">(</span><span class="nl">alertView</span><span class="p">:</span> <span class="bp">UIAlertView</span><span class="p">,</span> <span class="n">didDismissWithButtonIndex</span> <span class="nl">buttonIndex</span><span class="p">:</span> <span class="n">Int</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="n">alertCompletion</span><span class="o">?</span><span class="p">(</span><span class="n">buttonIndex</span><span class="p">)</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now, all that is necessary to use create an alert is:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='swift'><span class='line'><span class="n">alert</span><span class="p">.</span><span class="n">title</span><span class="p">(</span><span class="s">&quot;Question&quot;</span><span class="p">)</span>
</span><span class='line'><span class="p">.</span><span class="n">message</span><span class="p">(</span><span class="s">&quot;Do you like apples?&quot;</span><span class="p">)</span>
</span><span class='line'><span class="p">.</span><span class="n">buttonTitles</span><span class="p">(</span><span class="s">&quot;Yes, I do!&quot;</span><span class="p">,</span><span class="s">&quot;More of less&quot;</span><span class="p">,</span> <span class="s">&quot;I hate it!&quot;</span><span class="p">)</span>
</span><span class='line'><span class="p">.</span><span class="n">show</span> <span class="p">{</span> <span class="n">index</span> <span class="k">in</span>
</span><span class='line'>    <span class="n">print</span><span class="p">(</span><span class="n">index</span><span class="p">)</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>In the past, I would have used the first approach and lived with that. Of course, showing alerts to the user is a very tiny part of a real work application. But that&rsquo;s preciselly where I was wrong. This kind of applicability of the builder (among all other design patterns) is what makes software components reusable.
And there are some other places where you could apply the same principle, for example <code>NSAttributedString</code> or <code>UIActionSheet</code>.</p>

<p>I hope you find that useful. Builder to the rescue!</p>

<p>P.S: Yes, yes I know that Apple has released <code>UIAlertController</code> and deprecated both <code>UIAlertView</code> and <code>UIActionSheet</code>. However, the idea is pretty much the same, alothough what Apple did is Factory instead of a Builder.</p>
]]></content>
    
  </entry>
  
  <entry>
    
    <title type="html"><![CDATA[@noescape attribute]]></title>
    <link href="http://nshint.github.io/blog/2015/10/23/noescape-attribute/"/>
    
    <updated>2015-10-23T17:00:00+02:00</updated>
    <id>http://nshint.github.io/blog/2015/10/23/noescape-attribute</id>
    
    <content type="html"><![CDATA[<p>Swift 1.2 introduced us with <code>@noescape</code> attribute. It&rsquo;s a very important feature, when we want to make our code more cleaner and stricter. Using it properly at 3am will prevent many unwanted retain cycles.</p>

<p>While digging into <a href="https://developer.apple.com/library/ios/releasenotes/DeveloperTools/RN-Xcode/Chapters/xc6_release_notes.html">release notes</a> we can see a bunch of clever words:</p>

<blockquote><p>A new <code>@noescape</code> attribute may be used on closure parameters to functions. This indicates that the parameter is only ever called (or passed as an @noescape parameter in a call), which means that it cannot outlive the lifetime of the call. This enables some minor performance optimizations, but more importantly disables the <code>self.</code> requirement in closure arguments.</p></blockquote>

<!--more-->


<p>Lets analyze those smart statements and put it into code so everyone can enjoy it:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='swift'><span class='line'><span class="k">func</span> <span class="nf">foo</span><span class="p">(@</span><span class="n">noescape</span> <span class="nl">code</span><span class="p">:(()</span> <span class="o">-&gt;</span> <span class="n">String</span><span class="p">))</span> <span class="o">-&gt;</span> <span class="n">String</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="s">&quot;foo \(bar(code))&quot;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">func</span> <span class="n">bar</span><span class="p">(@</span><span class="n">noescape</span> <span class="nl">code</span><span class="p">:(()</span> <span class="o">-&gt;</span> <span class="n">String</span><span class="p">))</span> <span class="o">-&gt;</span> <span class="n">String</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">code</span><span class="p">()</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="n">print</span><span class="p">(</span><span class="n">foo</span><span class="p">()</span> <span class="p">{</span><span class="s">&quot;bar&quot;</span><span class="p">})</span>
</span></code></pre></td></tr></table></div></figure>


<p>It can be also captured in another <code>@noescape</code> closure:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='swift'><span class='line'><span class="k">func</span> <span class="nf">baz</span><span class="p">(@</span><span class="n">noescape</span> <span class="nl">code</span><span class="p">:(()</span> <span class="o">-&gt;</span> <span class="n">String</span><span class="p">))</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="n">qux</span> <span class="p">{</span>
</span><span class='line'>        <span class="n">code</span><span class="p">()</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="k">func</span> <span class="nf">qux</span><span class="p">(@</span><span class="n">noescape</span> <span class="nl">code</span><span class="p">:(()</span> <span class="o">-&gt;</span> <span class="n">String</span><span class="p">))</span> <span class="p">{}</span>
</span></code></pre></td></tr></table></div></figure>


<p>It&rsquo;s important to point out, that closures (and functions) annotated with <code>@noescape</code> can only be passed as <code>@noescape</code> parameters. What this mean is:</p>

<ul>
<li>we cannot run it asynchronously:
<img class="center" src="http://nshint.github.io/images/noescape-attribute/noescape-async.png"></li>
<li>we can&rsquo;t store it
<img class="center" src="http://nshint.github.io/images/noescape-attribute/noescape-store.png"></li>
<li>we can&rsquo;t capture it in another non-<code>@noescape</code> closure
<img class="center" src="http://nshint.github.io/images/noescape-attribute/noescape-capture.png"></li>
</ul>


<p>Last to mention, in the future releases this will be taken even further:</p>

<blockquote><p>This enables control-flow-like functions to be more transparent about their behavior. In a future beta, the standard library will adopt this attribute in functions like autoreleasepool().</p></blockquote>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='swift'><span class='line'><span class="k">func</span> <span class="nf">autoreleasepool</span><span class="p">(@</span><span class="n">noescape</span> <span class="nl">code</span><span class="p">:</span> <span class="p">()</span> <span class="o">-&gt;</span> <span class="p">())</span> <span class="p">{</span>
</span><span class='line'>    <span class="n">pushAutoreleasePool</span><span class="p">()</span>
</span><span class='line'>    <span class="n">code</span><span class="p">()</span>
</span><span class='line'>    <span class="n">popAutoreleasePool</span><span class="p">()</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>So dear developer the best is yet to come! ;]</p>
]]></content>
    
  </entry>
  
  <entry>
    
    <title type="html"><![CDATA[Working with CFunction pointers in Swift]]></title>
    <link href="http://nshint.github.io/blog/2015/10/10/working-with-cfunction-pointers-in-swift/"/>
    
    <updated>2015-10-10T11:03:46+02:00</updated>
    <id>http://nshint.github.io/blog/2015/10/10/working-with-cfunction-pointers-in-swift</id>
    
    <content type="html"><![CDATA[<p>Swift like objC allow us to mix it with other languages, unfotunately when it comes to Swift we can only choose between our good old friend objC or ANIS C, as there is still lack of C++ support. Basically using function pointers allows us to call C functions inside Swift. Swift will automatically convert methods included in Bridge Header into Swift equivalents:</p>

<!--more-->


<p>This code:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='C'><span class='line'><span class="kt">void</span> <span class="nf">InitializeAudioSource</span><span class="p">(</span><span class="kt">void</span> <span class="o">*</span><span class="n">userAudioClass</span><span class="p">);</span>
</span><span class='line'><span class="kt">void</span> <span class="nf">PlayAudio</span><span class="p">();</span>
</span><span class='line'><span class="kt">void</span> <span class="nf">SetAudioGain</span><span class="p">(</span><span class="n">Float32</span> <span class="n">gain</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>Will be converted into:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='Swift'><span class='line'><span class="n">Void</span> <span class="n">InitializeAudioSource</span><span class="p">(</span><span class="nl">userAudioClass</span><span class="p">:</span> <span class="n">UnsafeMutablePointer</span><span class="o">&lt;</span><span class="n">Void</span><span class="o">&gt;</span><span class="p">)</span>
</span><span class='line'><span class="n">Void</span> <span class="n">PlayAudio</span><span class="p">(</span><span class="n">Void</span><span class="p">)</span>
</span><span class='line'><span class="n">Void</span> <span class="n">SetAudioGain</span><span class="p">(</span><span class="nl">gain</span><span class="p">:</span><span class="n">Float32</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>And as far this is all pretty straightforward so now having our C CoreAudio implementation we can use it in our Swift project like that:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
</pre></td><td class='code'><pre><code class='Swift'><span class='line'><span class="k">class</span> <span class="nl">KWSBackgroundStreamPlayer</span><span class="p">:</span> <span class="bp">NSObject</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">func</span> <span class="n">setGain</span><span class="p">(</span><span class="nl">gain</span> <span class="p">:</span> <span class="n">Float32</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>        <span class="n">SetAudioGain</span><span class="p">(</span><span class="n">gain</span><span class="p">)</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">func</span> <span class="n">play</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>        <span class="n">PlayAudio</span><span class="p">()</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">func</span> <span class="n">pause</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>        <span class="n">PauseAudio</span><span class="p">()</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">func</span> <span class="n">close</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">if</span> <span class="nb">self</span><span class="p">.</span><span class="n">trackClosed</span> <span class="o">==</span> <span class="nb">true</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>            <span class="k">return</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>        <span class="nb">self</span><span class="p">.</span><span class="n">trackClosed</span> <span class="o">=</span> <span class="nb">true</span>
</span><span class='line'>
</span><span class='line'>        <span class="n">CloseAudio</span><span class="p">()</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">deinit</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>        <span class="nb">self</span><span class="p">.</span><span class="n">close</span><span class="p">()</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>But because Swift is very strict when it comes to type checks we are no more able to pass our class to <code>InitializeAudioSource</code> function, if you try to do so:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='Swift'><span class='line'><span class="n">InitializeAudioSource</span><span class="p">(</span> <span class="o">&amp;</span><span class="nb">self</span> <span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>You will end up with this error:</p>

<p><img class="center" src="http://nshint.github.io/images/cfunction_pointers/error_cfunction.png"></p>

<p>And this is were the bad hacks come in. Unfotunately we need to get a &ldquo;true&rdquo; raw pointer to be able to pass it back to C code and to so we need this piece of code:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='Swift'><span class='line'><span class="c1">//convert self to unmanaged object</span>
</span><span class='line'><span class="k">let</span> <span class="n">anUnmanaged</span> <span class="o">=</span> <span class="n">Unmanaged</span><span class="o">&lt;</span><span class="n">KWSBackgroundStreamPlayer</span><span class="o">&gt;</span><span class="p">.</span><span class="n">passUnretained</span><span class="p">(</span><span class="nb">self</span><span class="p">)</span>
</span><span class='line'><span class="c1">//get raw data pointer</span>
</span><span class='line'><span class="k">let</span> <span class="nl">opaque</span><span class="p">:</span> <span class="n">COpaquePointer</span> <span class="o">=</span> <span class="n">anUnmanaged</span><span class="p">.</span><span class="n">toOpaque</span><span class="p">()</span>
</span><span class='line'><span class="c1">//convert to Mutable to match Swift safe type check</span>
</span><span class='line'><span class="k">let</span> <span class="n">voidSelf</span> <span class="o">=</span> <span class="n">UnsafeMutablePointer</span><span class="o">&lt;</span><span class="n">Void</span><span class="o">&gt;</span><span class="p">(</span><span class="n">opaque</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="n">InitializeAudioSource</span><span class="p">(</span> <span class="n">voidSelf</span> <span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>And that&rsquo;s how you pass Swift classes and objects to C code, and you will need to do it every time you need a void or any other fancy pointer on C side.</p>

<p>What happens here is that we first take an <code>Unmanaged</code> version of our class object this tells compiler that we are now responsible for memory management, and stops doing retain release magic under the hood for us. But still this is not enough, now we need a raw memory pointer from that unmanaged object and thats where <code>toOpaque()</code> comes in. This will return an raw C pointer of our class object. This is the true <code>void *</code> pointer.
<code>COpaquePointer</code> is memory representation of something that cannot be represented in Swift so you should be very careful when playing with this kind of pointers. Now we just need to make it a proper type in this case <code>UnsafeMutablePointer</code> with <code>&lt;Void&gt;</code> class type. Every UnsafePointer have constructor that takes <code>COpaquePointer</code> so you have to be sure you are choosing proper type when creating it as there is no type check at this point!</p>

<p>Hopefully on C side it&rsquo;s easy to convert void pointer to proper class type, you just need to use <code>bridge</code> to do so:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
</pre></td><td class='code'><pre><code class='C'><span class='line'><span class="kt">void</span> <span class="nf">InitializeAudioSource</span><span class="p">(</span><span class="kt">void</span> <span class="o">*</span><span class="n">userAudioClass</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="c1">//bridge it back to our class </span>
</span><span class='line'>    <span class="n">KWSBackgroundStreamPlayer</span> <span class="o">*</span><span class="n">backgroundPlayer</span> <span class="o">=</span> <span class="p">(</span><span class="n">__bridge</span> <span class="n">KWSBackgroundStreamPlayer</span><span class="o">*</span><span class="p">)</span><span class="n">userAudioClass</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">//get some properties</span>
</span><span class='line'>    <span class="n">NSString</span> <span class="o">*</span><span class="n">path</span> <span class="o">=</span> <span class="n">backgroundPlayer</span><span class="p">.</span><span class="n">filePath</span><span class="p">;</span>
</span><span class='line'>    <span class="n">repeatSong</span> <span class="o">=</span> <span class="n">backgroundPlayer</span><span class="p">.</span><span class="n">repeatSong</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">//...    </span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">//we can even pass it as parameter with proper pointer type</span>
</span><span class='line'>    <span class="n">OSStatus</span> <span class="n">result</span> <span class="o">=</span> <span class="n">AudioQueueNewOutput</span><span class="p">(</span><span class="o">&amp;</span><span class="n">dataFormat</span><span class="p">,</span> <span class="n">BufferCallback</span><span class="p">,</span> <span class="p">(</span><span class="n">__bridge</span> <span class="kt">void</span> <span class="o">*</span><span class="p">)(</span><span class="n">backgroundPlayer</span><span class="p">),</span> <span class="n">nil</span><span class="p">,</span> <span class="n">nil</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">queue</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">//... </span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>I hope this will help people understand a bit more about how danger may be playing with C in Swift and vice versa. Using <code>Unmanaged</code> and <code>COpaquePointer</code> may lead to crashes and memory leaks, as in some cases you are again responsible for manual memory managment, you are able to get raw pointers with no type that can be casted to whatever you want and so on.</p>

<p>Overall this is a powerful magic you can do in Swift but as someone said: &ldquo;With Great Power Comes Great Responsibility&rdquo; ;)</p>

<p>Example usage available on <a href="https://github.com/noxytrux/KnightWhoSaidSwift">github</a></p>
]]></content>
    
  </entry>
  
  <entry>
    
    <title type="html"><![CDATA[Bluetooth low energy the fun way]]></title>
    <link href="http://nshint.github.io/blog/2015/10/08/bluetooth-low-energy-the-fun-way/"/>
    
    <updated>2015-10-08T18:17:28+02:00</updated>
    <id>http://nshint.github.io/blog/2015/10/08/bluetooth-low-energy-the-fun-way</id>
    
    <content type="html"><![CDATA[<p>Today Bluetooth Low Energy can be found in many cool applications, it can be used from simple data exchange to payment terminals and the more popular usage with iBeacons. But what if we want to build something funny with it? Like some simple game not even realtime, it may be even turn based game. Imagine you do not need to go through this long setup, waiting for server players to be ready etc.</p>

<p>Everyone knows that building good multiplayer game is hard, multiplayer itself is hard&hellip; But here I want to show you my small proof of concept of working bluetooth low enery multiplayer game.</p>

<!--more-->


<p>It can be used in any kind of game! Strategy, board, rpg, race. I built§ a small demo project to show this in details but now let&rsquo;s focus on basics:</p>

<p>Pros:</p>

<ol>
<li>It&rsquo;s simple!</li>
<li>Works with any device</li>
<li>No need to pair, login etc. Just come near other phone</li>
</ol>


<p>Cons:</p>

<ol>
<li>Bandwith (approx 30bytes of data per packet which todays is nothing)</li>
<li>Limited distance (work well in approx 20m range)</li>
</ol>


<p>We have our interface class that will be used to extend functionality on both server and client logic (we use central and peripheral mode of our phone)</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
</pre></td><td class='code'><pre><code class='Swift'><span class='line'><span class="k">enum</span> <span class="nl">KWSPacketType</span> <span class="p">:</span> <span class="n">Int8</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">case</span> <span class="n">HearBeat</span>
</span><span class='line'>    <span class="k">case</span> <span class="n">Connect</span>
</span><span class='line'>    <span class="k">case</span> <span class="n">Disconnect</span>
</span><span class='line'>    <span class="k">case</span> <span class="n">MoveUp</span>
</span><span class='line'>    <span class="k">case</span> <span class="n">MoveDown</span>
</span><span class='line'>    <span class="k">case</span> <span class="n">Jump</span>
</span><span class='line'>    <span class="k">case</span> <span class="n">Attack</span>
</span><span class='line'>    <span class="k">case</span> <span class="n">DefenseUp</span>
</span><span class='line'>    <span class="k">case</span> <span class="n">DefenseDown</span>
</span><span class='line'>    <span class="k">case</span> <span class="n">Restart</span>
</span><span class='line'>    <span class="k">case</span> <span class="n">GameEnd</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">protocol</span> <span class="nl">KWSBlueToothLEDelegate</span><span class="p">:</span> <span class="k">class</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">func</span> <span class="n">interfaceDidUpdate</span><span class="p">(</span><span class="n">interface</span> <span class="nl">interface</span><span class="p">:</span> <span class="n">KWSBluetoothLEInterface</span><span class="p">,</span> <span class="nl">command</span><span class="p">:</span> <span class="n">KWSPacketType</span><span class="p">,</span> <span class="nl">data</span><span class="p">:</span> <span class="bp">NSData</span><span class="o">?</span><span class="p">)</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nl">KWSBluetoothLEInterface</span><span class="p">:</span> <span class="bp">NSObject</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">weak</span> <span class="k">var</span> <span class="nl">delegate</span> <span class="p">:</span> <span class="n">KWSBlueToothLEDelegate</span><span class="o">?</span>
</span><span class='line'>    <span class="k">weak</span> <span class="k">var</span> <span class="nl">ownerViewController</span> <span class="p">:</span> <span class="bp">UIViewController</span><span class="o">?</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">var</span> <span class="nl">interfaceConnected</span> <span class="p">:</span> <span class="n">Bool</span> <span class="o">=</span> <span class="nb">false</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">init</span><span class="p">(</span><span class="nl">ownerController</span> <span class="p">:</span> <span class="bp">UIViewController</span><span class="p">,</span> <span class="nl">delegate</span><span class="p">:</span> <span class="n">KWSBlueToothLEDelegate</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>        <span class="nb">self</span><span class="p">.</span><span class="n">ownerViewController</span> <span class="o">=</span> <span class="n">ownerController</span>
</span><span class='line'>        <span class="nb">self</span><span class="p">.</span><span class="n">delegate</span> <span class="o">=</span> <span class="n">delegate</span>
</span><span class='line'>        <span class="nb">super</span><span class="p">.</span><span class="k">init</span><span class="p">()</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">func</span> <span class="n">sendCommand</span><span class="p">(</span><span class="n">command</span> <span class="nl">command</span><span class="p">:</span> <span class="n">KWSPacketType</span><span class="p">,</span> <span class="nl">data</span><span class="p">:</span> <span class="bp">NSData</span><span class="o">?</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>        <span class="nb">self</span><span class="p">.</span><span class="n">doesNotRecognizeSelector</span><span class="p">(</span><span class="n">Selector</span><span class="p">(</span><span class="kt">__FUNCTION__</span><span class="p">))</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>As you can see, it&rsquo;s very simple - one send and one receive method as delegate. As both recive and send arguments, we can get the command used in your game to recognize packet type and data which will come along with this command.</p>

<p>Now we need to implement our server and client logic, i don&rsquo;t want to describe in details how to setup BluetoothLE on iPhone so insted I will highlight only important methods like receiving and sending packet on both client and server side.</p>

<p><code>KWSBluetoothLEClient</code></p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
</pre></td><td class='code'><pre><code class='Swift'><span class='line'><span class="k">class</span> <span class="nl">KWSBluetoothLEClient</span><span class="p">:</span> <span class="n">KWSBluetoothLEInterface</span><span class="p">,</span> <span class="bp">CBPeripheralManagerDelegate</span>  <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>  <span class="kr">override</span> <span class="k">func</span> <span class="n">sendCommand</span><span class="p">(</span><span class="n">command</span> <span class="nl">command</span><span class="p">:</span> <span class="n">KWSPacketType</span><span class="p">,</span> <span class="nl">data</span><span class="p">:</span> <span class="bp">NSData</span><span class="o">?</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">if</span> <span class="o">!</span><span class="n">interfaceConnected</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>            <span class="k">return</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">var</span> <span class="nl">header</span> <span class="p">:</span> <span class="n">Int8</span> <span class="o">=</span> <span class="n">command</span><span class="p">.</span><span class="n">rawValue</span>
</span><span class='line'>        <span class="k">let</span> <span class="nl">dataToSend</span> <span class="p">:</span> <span class="bp">NSMutableData</span> <span class="o">=</span> <span class="bp">NSMutableData</span><span class="p">(</span><span class="nl">bytes</span><span class="p">:</span> <span class="o">&amp;</span><span class="n">header</span><span class="p">,</span> <span class="nl">length</span><span class="p">:</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">Int8</span><span class="p">))</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">if</span> <span class="k">let</span> <span class="n">data</span> <span class="o">=</span> <span class="n">data</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>            <span class="n">dataToSend</span><span class="p">.</span><span class="n">appendData</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">if</span> <span class="n">dataToSend</span><span class="p">.</span><span class="n">length</span> <span class="o">&gt;</span> <span class="n">kKWSMaxPacketSize</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>            <span class="n">print</span><span class="p">(</span><span class="s">&quot;Error data packet to long!&quot;</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>            <span class="k">return</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>        <span class="nb">self</span><span class="p">.</span><span class="n">peripheralManager</span><span class="p">.</span><span class="n">updateValue</span><span class="p">(</span> <span class="n">dataToSend</span><span class="p">,</span>
</span><span class='line'>                         <span class="nl">forCharacteristic</span><span class="p">:</span> <span class="nb">self</span><span class="p">.</span><span class="n">readCharacteristic</span><span class="p">,</span>
</span><span class='line'>                      <span class="nl">onSubscribedCentrals</span><span class="p">:</span> <span class="nb">nil</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">func</span> <span class="n">peripheralManager</span><span class="p">(</span><span class="nl">peripheral</span><span class="p">:</span> <span class="bp">CBPeripheralManager</span><span class="p">,</span> <span class="n">didReceiveWriteRequests</span> <span class="nl">requests</span><span class="p">:</span> <span class="p">[</span><span class="bp">CBATTRequest</span><span class="p">])</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">if</span> <span class="n">requests</span><span class="p">.</span><span class="n">count</span> <span class="o">==</span> <span class="mi">0</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>            <span class="k">return</span><span class="p">;</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">for</span> <span class="n">req</span> <span class="k">in</span> <span class="n">requests</span> <span class="kt">as</span> <span class="p">[</span><span class="bp">CBATTRequest</span><span class="p">]</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>            <span class="k">let</span> <span class="nl">data</span> <span class="p">:</span> <span class="bp">NSData</span> <span class="o">=</span> <span class="n">req</span><span class="p">.</span><span class="n">value</span><span class="o">!</span>
</span><span class='line'>            <span class="k">let</span> <span class="nl">header</span> <span class="p">:</span> <span class="bp">NSData</span> <span class="o">=</span> <span class="n">data</span><span class="p">.</span><span class="n">subdataWithRange</span><span class="p">(</span><span class="n">NSMakeRange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">Int8</span><span class="p">)))</span>
</span><span class='line'>
</span><span class='line'>            <span class="k">let</span> <span class="n">remainingVal</span> <span class="o">=</span> <span class="n">data</span><span class="p">.</span><span class="n">length</span> <span class="o">-</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">Int8</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>            <span class="k">var</span> <span class="nl">body</span> <span class="p">:</span> <span class="bp">NSData</span><span class="o">?</span> <span class="o">=</span> <span class="nb">nil</span>
</span><span class='line'>
</span><span class='line'>            <span class="k">if</span> <span class="n">remainingVal</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>                <span class="n">body</span> <span class="o">=</span> <span class="n">data</span><span class="p">.</span><span class="n">subdataWithRange</span><span class="p">(</span><span class="n">NSMakeRange</span><span class="p">(</span><span class="k">sizeof</span><span class="p">(</span><span class="n">Int8</span><span class="p">),</span> <span class="n">remainingVal</span><span class="p">))</span>
</span><span class='line'>            <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>            <span class="k">let</span> <span class="nl">actionValue</span> <span class="p">:</span> <span class="n">UnsafePointer</span><span class="o">&lt;</span><span class="n">Int8</span><span class="o">&gt;</span> <span class="o">=</span> <span class="n">UnsafePointer</span><span class="o">&lt;</span><span class="n">Int8</span><span class="o">&gt;</span><span class="p">(</span><span class="n">header</span><span class="p">.</span><span class="n">bytes</span><span class="p">)</span>
</span><span class='line'>            <span class="k">let</span> <span class="nl">action</span> <span class="p">:</span> <span class="n">KWSPacketType</span> <span class="o">=</span> <span class="n">KWSPacketType</span><span class="p">(</span><span class="nl">rawValue</span><span class="p">:</span> <span class="n">actionValue</span><span class="p">.</span><span class="n">memory</span><span class="p">)</span><span class="o">!</span>
</span><span class='line'>
</span><span class='line'>            <span class="nb">self</span><span class="p">.</span><span class="n">delegate</span><span class="o">?</span><span class="p">.</span><span class="n">interfaceDidUpdate</span><span class="p">(</span><span class="nl">interface</span><span class="p">:</span> <span class="nb">self</span><span class="p">,</span> <span class="nl">command</span><span class="p">:</span> <span class="n">action</span><span class="p">,</span> <span class="nl">data</span><span class="p">:</span> <span class="n">body</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>            <span class="nb">self</span><span class="p">.</span><span class="n">peripheralManager</span><span class="p">.</span><span class="n">respondToRequest</span><span class="p">(</span><span class="n">req</span><span class="p">,</span> <span class="nl">withResult</span><span class="p">:</span> <span class="n">CBATTError</span><span class="p">.</span><span class="n">Success</span><span class="p">)</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p><code>KWSBluetoothLEServer</code></p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
</pre></td><td class='code'><pre><code class='Swift'><span class='line'><span class="k">class</span> <span class="nl">KWSBluetoothLEServer</span><span class="p">:</span> <span class="n">KWSBluetoothLEInterface</span><span class="p">,</span> <span class="bp">CBCentralManagerDelegate</span><span class="p">,</span> <span class="bp">CBPeripheralDelegate</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="kr">override</span> <span class="k">func</span> <span class="n">sendCommand</span><span class="p">(</span><span class="n">command</span> <span class="nl">command</span><span class="p">:</span> <span class="n">KWSPacketType</span><span class="p">,</span> <span class="nl">data</span><span class="p">:</span> <span class="bp">NSData</span><span class="o">?</span><span class="p">){</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">if</span> <span class="o">!</span><span class="n">interfaceConnected</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>            <span class="k">return</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">var</span> <span class="nl">header</span> <span class="p">:</span> <span class="n">Int8</span> <span class="o">=</span> <span class="n">command</span><span class="p">.</span><span class="n">rawValue</span>
</span><span class='line'>        <span class="k">let</span> <span class="nl">dataToSend</span> <span class="p">:</span> <span class="bp">NSMutableData</span> <span class="o">=</span> <span class="bp">NSMutableData</span><span class="p">(</span><span class="nl">bytes</span><span class="p">:</span> <span class="o">&amp;</span><span class="n">header</span><span class="p">,</span> <span class="nl">length</span><span class="p">:</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">Int8</span><span class="p">))</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">if</span> <span class="k">let</span> <span class="n">data</span> <span class="o">=</span> <span class="n">data</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>            <span class="n">dataToSend</span><span class="p">.</span><span class="n">appendData</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">if</span> <span class="n">dataToSend</span><span class="p">.</span><span class="n">length</span> <span class="o">&gt;</span> <span class="n">kKWSMaxPacketSize</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>            <span class="n">print</span><span class="p">(</span><span class="s">&quot;Error data packet to long!&quot;</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>            <span class="k">return</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">if</span> <span class="k">let</span> <span class="n">discoveredPeripheral</span> <span class="o">=</span> <span class="nb">self</span><span class="p">.</span><span class="n">discoveredPeripheral</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>            <span class="n">discoveredPeripheral</span><span class="p">.</span><span class="n">writeValue</span><span class="p">(</span> <span class="n">dataToSend</span><span class="p">,</span>
</span><span class='line'>                          <span class="nl">forCharacteristic</span><span class="p">:</span> <span class="nb">self</span><span class="p">.</span><span class="n">writeCharacteristic</span><span class="p">,</span>
</span><span class='line'>                                       <span class="nl">type</span><span class="p">:</span> <span class="p">.</span><span class="n">WithResponse</span><span class="p">)</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">func</span> <span class="n">peripheral</span><span class="p">(</span><span class="nl">peripheral</span><span class="p">:</span> <span class="bp">CBPeripheral</span><span class="p">,</span> <span class="n">didUpdateValueForCharacteristic</span> <span class="nl">characteristic</span><span class="p">:</span> <span class="bp">CBCharacteristic</span><span class="p">,</span> <span class="nl">error</span><span class="p">:</span> <span class="bp">NSError</span><span class="o">?</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">if</span> <span class="k">let</span> <span class="n">error</span> <span class="o">=</span> <span class="n">error</span> <span class="p">{</span>
</span><span class='line'>            <span class="n">print</span><span class="p">(</span><span class="s">&quot;didUpdateValueForCharacteristic error: \(error.localizedDescription)&quot;</span><span class="p">)</span>
</span><span class='line'>            <span class="k">return</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">let</span> <span class="nl">data</span> <span class="p">:</span> <span class="bp">NSData</span> <span class="o">=</span> <span class="n">characteristic</span><span class="p">.</span><span class="n">value</span><span class="o">!</span>
</span><span class='line'>        <span class="k">let</span> <span class="nl">header</span> <span class="p">:</span> <span class="bp">NSData</span> <span class="o">=</span> <span class="n">data</span><span class="p">.</span><span class="n">subdataWithRange</span><span class="p">(</span><span class="n">NSMakeRange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">Int8</span><span class="p">)))</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">let</span> <span class="n">remainingVal</span> <span class="o">=</span> <span class="n">data</span><span class="p">.</span><span class="n">length</span> <span class="o">-</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">Int8</span><span class="p">)</span>
</span><span class='line'>        <span class="k">var</span> <span class="nl">body</span> <span class="p">:</span> <span class="bp">NSData</span><span class="o">?</span> <span class="o">=</span> <span class="nb">nil</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">if</span> <span class="n">remainingVal</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>            <span class="n">body</span> <span class="o">=</span> <span class="n">data</span><span class="p">.</span><span class="n">subdataWithRange</span><span class="p">(</span><span class="n">NSMakeRange</span><span class="p">(</span><span class="k">sizeof</span><span class="p">(</span><span class="n">Int8</span><span class="p">),</span> <span class="n">remainingVal</span><span class="p">))</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">let</span> <span class="nl">actionValue</span> <span class="p">:</span> <span class="n">UnsafePointer</span><span class="o">&lt;</span><span class="n">Int8</span><span class="o">&gt;</span> <span class="o">=</span> <span class="n">UnsafePointer</span><span class="o">&lt;</span><span class="n">Int8</span><span class="o">&gt;</span><span class="p">(</span><span class="n">header</span><span class="p">.</span><span class="n">bytes</span><span class="p">)</span>
</span><span class='line'>        <span class="k">let</span> <span class="nl">action</span> <span class="p">:</span> <span class="n">KWSPacketType</span> <span class="o">=</span> <span class="n">KWSPacketType</span><span class="p">(</span><span class="nl">rawValue</span><span class="p">:</span> <span class="n">actionValue</span><span class="p">.</span><span class="n">memory</span><span class="p">)</span><span class="o">!</span>
</span><span class='line'>
</span><span class='line'>        <span class="nb">self</span><span class="p">.</span><span class="n">delegate</span><span class="o">?</span><span class="p">.</span><span class="n">interfaceDidUpdate</span><span class="p">(</span><span class="nl">interface</span><span class="p">:</span> <span class="nb">self</span><span class="p">,</span> <span class="nl">command</span><span class="p">:</span> <span class="n">action</span><span class="p">,</span> <span class="nl">data</span><span class="p">:</span> <span class="n">body</span><span class="p">)</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>In both cases sending and reciving is the same:</p>

<p>Sending:</p>

<ol>
<li>Take raw value of the command</li>
<li>Save into NSData</li>
<li>Append using additional data that comes with the command</li>
<li>Send to peripheral/central</li>
</ol>


<p>Receive:</p>

<ol>
<li>Take NSData from central / peripheral (update request status if needed)</li>
<li>Get first byte to recognize command type</li>
<li>Take subset of Data by removing 1st byte and store it as value coming along with command</li>
<li>Take value of header byte and cast it to our PacketType</li>
<li>Send it to delegate</li>
</ol>


<p>Thanks to that we can build our game logic like this:</p>

<p>Setup:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='Swift'><span class='line'><span class="k">func</span> <span class="nf">setupGameLogic</span><span class="p">(</span><span class="nl">becomeServer</span><span class="p">:</span><span class="n">Bool</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>        <span class="nb">self</span><span class="p">.</span><span class="n">isServer</span> <span class="o">=</span> <span class="n">becomeServer</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">if</span> <span class="nb">self</span><span class="p">.</span><span class="n">isServer</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>            <span class="nb">self</span><span class="p">.</span><span class="n">communicationInterface</span> <span class="o">=</span> <span class="n">KWSBluetoothLEServer</span><span class="p">(</span><span class="nl">ownerController</span><span class="p">:</span> <span class="nb">self</span><span class="p">,</span> <span class="nl">delegate</span><span class="p">:</span> <span class="nb">self</span><span class="p">)</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>        <span class="k">else</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>            <span class="nb">self</span><span class="p">.</span><span class="n">communicationInterface</span> <span class="o">=</span> <span class="n">KWSBluetoothLEClient</span><span class="p">(</span><span class="nl">ownerController</span><span class="p">:</span> <span class="nb">self</span><span class="p">,</span> <span class="nl">delegate</span><span class="p">:</span> <span class="nb">self</span><span class="p">)</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Sending data to other player:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
</pre></td><td class='code'><pre><code class='Swift'><span class='line'><span class="c1">//player is dead notify other player</span>
</span><span class='line'><span class="nb">self</span><span class="p">.</span><span class="n">communicationInterface</span><span class="o">!</span><span class="p">.</span><span class="n">sendCommand</span><span class="p">(</span><span class="nl">command</span><span class="p">:</span> <span class="p">.</span><span class="n">GameEnd</span><span class="p">,</span> <span class="nl">data</span><span class="p">:</span> <span class="nb">nil</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="c1">//send some basic data about your player state (life, position)</span>
</span><span class='line'>
</span><span class='line'><span class="k">let</span> <span class="n">currentPlayer</span> <span class="o">=</span> <span class="nb">self</span><span class="p">.</span><span class="n">gameScene</span><span class="p">.</span><span class="n">selectedPlayer</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">var</span> <span class="n">packet</span> <span class="o">=</span> <span class="n">syncPacket</span><span class="p">()</span>
</span><span class='line'>        <span class="n">packet</span><span class="p">.</span><span class="n">healt</span> <span class="o">=</span> <span class="n">currentPlayer</span><span class="o">!</span><span class="p">.</span><span class="n">healt</span>
</span><span class='line'>        <span class="n">packet</span><span class="p">.</span><span class="n">posx</span> <span class="o">=</span> <span class="n">Float16CompressorCompress</span><span class="p">(</span><span class="n">Float32</span><span class="p">(</span><span class="n">currentPlayer</span><span class="o">!</span><span class="p">.</span><span class="n">position</span><span class="p">.</span><span class="n">x</span><span class="p">))</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">let</span> <span class="n">packetData</span> <span class="o">=</span> <span class="bp">NSData</span><span class="p">(</span><span class="nl">bytes</span><span class="p">:</span> <span class="o">&amp;</span><span class="n">packet</span><span class="p">,</span> <span class="nl">length</span><span class="p">:</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">syncPacket</span><span class="p">))</span>
</span><span class='line'>    <span class="nb">self</span><span class="p">.</span><span class="n">communicationInterface</span><span class="o">!</span><span class="p">.</span><span class="n">sendCommand</span><span class="p">(</span><span class="nl">command</span><span class="p">:</span> <span class="p">.</span><span class="n">HearBeat</span><span class="p">,</span> <span class="nl">data</span><span class="p">:</span> <span class="n">packetData</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="c1">//send some other info </span>
</span><span class='line'>
</span><span class='line'><span class="k">let</span> <span class="n">directionData</span> <span class="o">=</span> <span class="bp">NSData</span><span class="p">(</span><span class="nl">bytes</span><span class="p">:</span> <span class="o">&amp;</span><span class="n">currentPlayer</span><span class="o">!</span><span class="p">.</span><span class="n">movingLeft</span><span class="p">,</span> <span class="nl">length</span><span class="p">:</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">Bool</span><span class="p">))</span>
</span><span class='line'><span class="nb">self</span><span class="p">.</span><span class="n">communicationInterface</span><span class="o">!</span><span class="p">.</span><span class="n">sendCommand</span><span class="p">(</span><span class="nl">command</span><span class="p">:</span> <span class="p">.</span><span class="n">MoveDown</span><span class="p">,</span> <span class="nl">data</span><span class="p">:</span> <span class="n">directionData</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>Reciving data:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
</pre></td><td class='code'><pre><code class='Swift'><span class='line'><span class="k">func</span> <span class="nf">interfaceDidUpdate</span><span class="p">(</span><span class="n">interface</span> <span class="nl">interface</span><span class="p">:</span> <span class="n">KWSBluetoothLEInterface</span><span class="p">,</span> <span class="nl">command</span><span class="p">:</span> <span class="n">KWSPacketType</span><span class="p">,</span> <span class="nl">data</span><span class="p">:</span> <span class="bp">NSData</span><span class="o">?</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">switch</span><span class="p">(</span> <span class="n">command</span> <span class="p">)</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">case</span> <span class="p">.</span><span class="nl">HearBeat</span><span class="p">:</span>
</span><span class='line'>  <span class="k">if</span> <span class="k">let</span> <span class="n">data</span> <span class="o">=</span> <span class="n">data</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>      <span class="k">let</span> <span class="nl">subData</span> <span class="p">:</span> <span class="bp">NSData</span> <span class="o">=</span> <span class="n">data</span><span class="p">.</span><span class="n">subdataWithRange</span><span class="p">(</span><span class="n">NSMakeRange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">syncPacket</span><span class="p">)))</span>
</span><span class='line'>      <span class="k">let</span> <span class="n">packetMemory</span> <span class="o">=</span> <span class="n">UnsafePointer</span><span class="o">&lt;</span><span class="n">syncPacket</span><span class="o">&gt;</span><span class="p">(</span><span class="n">subData</span><span class="p">.</span><span class="n">bytes</span><span class="p">)</span>
</span><span class='line'>      <span class="k">let</span> <span class="n">packet</span> <span class="o">=</span> <span class="n">packetMemory</span><span class="p">.</span><span class="n">memory</span>
</span><span class='line'>
</span><span class='line'>      <span class="nb">self</span><span class="p">.</span><span class="n">gameScene</span><span class="p">.</span><span class="n">otherPlayer</span><span class="o">!</span><span class="p">.</span><span class="n">healt</span> <span class="o">=</span> <span class="n">packet</span><span class="p">.</span><span class="n">healt</span>
</span><span class='line'>      <span class="nb">self</span><span class="p">.</span><span class="n">gameScene</span><span class="p">.</span><span class="n">otherPlayer</span><span class="o">!</span><span class="p">.</span><span class="n">applyDamage</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>      <span class="k">let</span> <span class="n">decoded</span> <span class="o">=</span> <span class="n">Float16CompressorDecompress</span><span class="p">(</span><span class="n">packet</span><span class="p">.</span><span class="n">posx</span><span class="p">)</span>
</span><span class='line'>      <span class="k">let</span> <span class="n">realPos</span> <span class="o">=</span> <span class="nb">self</span><span class="p">.</span><span class="n">gameScene</span><span class="p">.</span><span class="n">otherPlayer</span><span class="o">!</span><span class="p">.</span><span class="n">position</span>
</span><span class='line'>      <span class="k">let</span> <span class="n">position</span> <span class="o">=</span> <span class="n">CGPointMake</span><span class="p">(</span><span class="n">CGFloat</span><span class="p">(</span><span class="n">decoded</span><span class="p">),</span> <span class="n">CGFloat</span><span class="p">(</span><span class="n">realPos</span><span class="p">.</span><span class="n">y</span><span class="p">))</span>
</span><span class='line'>
</span><span class='line'>      <span class="nb">self</span><span class="p">.</span><span class="n">gameScene</span><span class="p">.</span><span class="n">otherPlayer</span><span class="o">!</span><span class="p">.</span><span class="n">position</span> <span class="o">=</span> <span class="n">position</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">case</span> <span class="p">.</span><span class="nl">Jump</span><span class="p">:</span>
</span><span class='line'>      <span class="nb">self</span><span class="p">.</span><span class="n">gameScene</span><span class="p">.</span><span class="n">otherPlayer</span><span class="o">!</span><span class="p">.</span><span class="n">playerJump</span><span class="p">()</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">case</span> <span class="p">.</span><span class="nl">Restart</span><span class="p">:</span>
</span><span class='line'>      <span class="nb">self</span><span class="p">.</span><span class="n">unlockControls</span><span class="p">()</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">case</span> <span class="p">.</span><span class="nl">GameEnd</span><span class="p">:</span>
</span><span class='line'>      <span class="nb">self</span><span class="p">.</span><span class="n">lockControls</span><span class="p">()</span>
</span><span class='line'>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>And i get some pretty promising results:</p>

<p><img class="center" src="http://nshint.github.io/images/bluetooth_low_energy/multi_btle.gif"></p>

<p>Game works smoothly, there are no lags in connection and you can play almost instantly! And of course it allows you to integrate mutliplayer in your game in few minutes.</p>

<p>If you are starting your journey with gamedev or iOS and plan to build simple SpriteKit game with some basic multiplayer support it may be worth considering this option.</p>

<p>Demo project used to present the mechanics is available as always on <a href="https://github.com/noxytrux/KnightWhoSaidSwift">github</a></p>

<p>Game require at least two iPhone 5 to test and play. To start simply open game, one of the players choose server, other one client mode and bring your phone next to each another. Once you do that you should be notified about successfull connection by tone sound.</p>
]]></content>
    
  </entry>
  
  <entry>
    
    <title type="html"><![CDATA[Easy cast with _ObjectiveCBridgeable]]></title>
    <link href="http://nshint.github.io/blog/2015/10/07/easy-cast-with-_ObjectiveCBridgeable/"/>
    
    <updated>2015-10-07T19:15:43+02:00</updated>
    <id>http://nshint.github.io/blog/2015/10/07/easy-cast-with-_ObjectiveCBridgeable</id>
    
    <content type="html"><![CDATA[<p>Swift is out there for about a year and it&rsquo;s a great programming language. I think that almost every iOS/OSX developer out there has already written couple of things in Swift (if you haven&rsquo;t, go ahead and try, you won&rsquo;t regret it, I promise). Although, we have many years of libs and frameworks built using Objective-C and sooner or later a project may have both Swift and Objective-C working together.</p>

<!--more-->


<p>Fortunately, Apple gave us a <a href="https://itunes.apple.com/us/book/using-swift-cocoa-objective/id888894773?mt=11">book</a> and a couple of WWDC session (<a href="https://developer.apple.com/videos/play/wwdc2014-406/">here</a> and <a href="https://developer.apple.com/videos/play/wwdc2015-401/">here</a>) with the intent to help developers on this task.</p>

<p>For those who have some experience with this integration knows that casting plays an important role. So, todays hint will dig into an poor documented protocol called <code>_ObjectiveCBridgeable</code>.</p>

<p>The documentation, which is only founded in header files says:</p>

<blockquote><p>A Swift Array or Dictionary of types conforming to <em>ObjectiveCBridgeable can be passed to Objective-C as an NSArray or NSDictionary, respectively. The elements of the resulting NSArray or NSDictionary will be the result of calling </em>bridgeToObjectiveC on each element of the source container.</p></blockquote>

<p>Ok, but there is something else you can do with that, which is very handy.</p>

<p>Suppose that you have this class in Objective-C:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="k">@interface</span> <span class="nc">OPerson</span>: <span class="bp">NSObject</span>
</span><span class='line'>
</span><span class='line'><span class="p">-</span> <span class="p">(</span><span class="kt">instancetype</span><span class="p">)</span><span class="nf">initWithName:</span><span class="p">(</span><span class="bp">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">name</span> <span class="nf">surname:</span><span class="p">(</span><span class="bp">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">surname</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="k">@property</span> <span class="p">(</span><span class="k">nonatomic</span><span class="p">,</span> <span class="k">copy</span><span class="p">)</span> <span class="p">(</span><span class="bp">NSString</span> <span class="o">*</span><span class="p">)</span><span class="n">name</span><span class="p">;</span>
</span><span class='line'><span class="k">@property</span> <span class="p">(</span><span class="k">nonatomic</span><span class="p">,</span> <span class="k">copy</span><span class="p">)</span> <span class="p">(</span><span class="bp">NSString</span> <span class="o">*</span><span class="p">)</span><span class="n">surname</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="k">@end</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now you want to easily cast this class into a Swift struct. Yes, we can! All you have to do is conform to <code>_ObjectiveCBridgeable</code>, like so:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
</pre></td><td class='code'><pre><code class='swift'><span class='line'><span class="k">struct</span> <span class="n">Person</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">let</span> <span class="nl">name</span><span class="p">:</span> <span class="n">String</span>
</span><span class='line'>        <span class="k">let</span> <span class="nl">surname</span><span class="p">:</span> <span class="n">String</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">extension</span> <span class="nl">Person</span><span class="p">:</span> <span class="n">_ObjectiveCBridgeable</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">typealias</span> <span class="n">_ObjectiveCType</span> <span class="o">=</span> <span class="n">OPerson</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">static</span> <span class="k">func</span> <span class="n">_isBridgedToObjectiveC</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="n">Bool</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">return</span> <span class="n">type</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">static</span> <span class="k">func</span> <span class="n">_getObjectiveCType</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="n">Any</span><span class="p">.</span><span class="kt">Type</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">return</span> <span class="n">ObjectiveCType</span><span class="p">.</span><span class="nb">self</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">func</span> <span class="n">_bridgeToObjectiveC</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="n">_ObjectiveCType</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">return</span> <span class="n">OPerson</span><span class="p">(</span><span class="nl">name</span><span class="p">:</span> <span class="n">name</span><span class="p">,</span> <span class="nl">surname</span><span class="p">:</span> <span class="n">surname</span><span class="p">)</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">static</span> <span class="k">func</span> <span class="n">_forceBridgeFromObjectiveC</span><span class="p">(</span><span class="nl">source</span><span class="p">:</span> <span class="n">_ObjectiveCType</span><span class="p">,</span> <span class="k">inout</span> <span class="nl">result</span><span class="p">:</span> <span class="n">Person</span><span class="o">?</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="n">result</span> <span class="o">=</span> <span class="n">Person</span><span class="p">(</span><span class="nl">name</span><span class="p">:</span> <span class="n">source</span><span class="p">.</span><span class="n">name</span><span class="p">,</span> <span class="nl">surname</span><span class="p">:</span> <span class="n">source</span><span class="p">.</span><span class="n">name</span><span class="p">)</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">static</span> <span class="k">func</span> <span class="n">_conditionallyBridgeFRomObjectiveC</span><span class="p">(</span><span class="nl">source</span><span class="p">:</span> <span class="n">_ObjectiveCType</span><span class="p">,</span> <span class="k">inout</span> <span class="nl">result</span><span class="p">:</span> <span class="n">Person</span><span class="o">?</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Bool</span> <span class="p">{</span>
</span><span class='line'>            <span class="n">_forceBridgeFromObjectiveC</span><span class="p">(</span><span class="n">source</span><span class="p">,</span> <span class="nl">result</span><span class="p">:</span> <span class="o">&amp;</span><span class="n">result</span><span class="p">)</span>
</span><span class='line'>            <span class="k">return</span> <span class="nb">true</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>And voilá!</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class='swift'><span class='line'><span class="k">let</span> <span class="n">objcPerson</span> <span class="o">=</span> <span class="n">OPerson</span><span class="p">(</span><span class="nl">name</span><span class="p">:</span> <span class="s">&quot;John&quot;</span><span class="p">,</span> <span class="nl">surname</span><span class="p">:</span> <span class="s">&quot;Doe&quot;</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="k">if</span> <span class="k">let</span> <span class="n">swiftPerson</span> <span class="o">=</span> <span class="n">objcPerson</span> <span class="kt">as</span><span class="o">?</span> <span class="n">Person</span> <span class="p">{</span>
</span><span class='line'>  <span class="c1">//will work</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">let</span> <span class="n">swiftPerson</span> <span class="o">=</span> <span class="n">objcPerson</span> <span class="kt">as</span> <span class="n">Person</span> <span class="c1">//this too!</span>
</span><span class='line'>
</span><span class='line'><span class="k">let</span> <span class="n">swiftPerson2</span> <span class="o">=</span> <span class="n">Person</span><span class="p">(</span><span class="nl">name</span><span class="p">:</span> <span class="s">&quot;Jack&quot;</span><span class="p">,</span> <span class="nl">surname</span><span class="p">:</span><span class="s">&quot;Doe&quot;</span><span class="p">)</span>
</span><span class='line'><span class="k">let</span> <span class="n">objcPerson</span> <span class="o">=</span> <span class="n">swiftPerson2</span> <span class="kt">as</span> <span class="n">OPerson</span> <span class="c1">//and that</span>
</span><span class='line'>
</span><span class='line'><span class="k">let</span> <span class="nl">person</span><span class="p">:</span> <span class="n">OPerson</span> <span class="o">=</span> <span class="n">Person</span><span class="p">(</span><span class="nl">name</span><span class="p">:</span> <span class="s">&quot;Alfred&quot;</span><span class="p">,</span> <span class="nl">surname</span><span class="p">:</span> <span class="s">&quot;Doe&quot;</span><span class="p">)</span> <span class="c1">//hooray</span>
</span></code></pre></td></tr></table></div></figure>


<p>Oh, that&rsquo;s so beautiful, don&rsquo;t you think? :]</p>
]]></content>
    
  </entry>
  
  <entry>
    
    <title type="html"><![CDATA[UITraitCollection trick]]></title>
    <link href="http://nshint.github.io/blog/2015/09/23/uitraitcollection-trick/"/>
    
    <updated>2015-09-23T19:15:43+02:00</updated>
    <id>http://nshint.github.io/blog/2015/09/23/uitraitcollection-trick</id>
    
    <content type="html"><![CDATA[<p>Gone are the days where there was just one iPhone for developers as a target. Now we have to support multiple devices with different screen sizes. Fortunately, we have autolayout, which solves a part of this design equation, the other part is solved with <a href="https://developer.apple.com/library/ios/documentation/UIKit/Reference/UITraitCollection_ClassReference/"><code>UITraitCollection</code></a>. Trait collection object has two size classes: horizontal and vertical. Each of these classes has three possible values: compact, regular or any. The current device+orientation can be described as a combination of the sizes.</p>

<!--more-->


<p><img class="center" src="http://nshint.github.io/images/uitraitcollection_trick/1.png"></p>

<p>The best thing is that storyboards and nib files support these size classes. We can make layout changes directly onto them. Every view or auto-layout constraint can exist in one or several other size classes. So it is possible to support multiple devices and orientations without any code. Nevertheless there is a case, which is not covered at all. Imagine that you support only portrait mode and the designer wishes to make a difference between iPhone 5 and iPhone 6+ screen. In this case, size classes are not much helpful. However, we can leverage them in an unusual way.</p>

<p><code>UITraitEnvironment</code> is a protocol which provides access to trait collection. Its conformed by most of the objects in view hierarchy: <code>UIScreen</code>, <code>UIWindow</code>, <code>UIViewController</code>, <code>UIView</code>. Every child inherits the trait collection object from its parent. The trick is to override the trait collection in <code>UIWindow</code> and return a custom value for iPhone 6+ device. Take a look:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
</pre></td><td class='code'><pre><code class='swift'><span class='line'><span class="p">@</span><span class="n">objc</span> <span class="n">public</span> <span class="k">class</span> <span class="nl">Window</span><span class="p">:</span> <span class="bp">UIWindow</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="kr">override</span> <span class="n">public</span> <span class="k">var</span> <span class="nl">traitCollection</span><span class="p">:</span> <span class="n">UITraitCollection</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">if</span> <span class="n">DeviceType</span><span class="p">.</span><span class="n">isIPhone6P</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>            <span class="k">var</span> <span class="n">collections</span> <span class="o">=</span> <span class="p">[</span><span class="n">UITraitCollection</span><span class="p">(</span><span class="nl">horizontalSizeClass</span><span class="p">:</span> <span class="p">.</span><span class="n">Compact</span><span class="p">),</span>
</span><span class='line'>                <span class="n">UITraitCollection</span><span class="p">(</span><span class="nl">verticalSizeClass</span><span class="p">:</span> <span class="p">.</span><span class="n">Compact</span><span class="p">)]</span>
</span><span class='line'>
</span><span class='line'>            <span class="k">return</span> <span class="n">UITraitCollection</span><span class="p">(</span><span class="nl">traitsFromCollections</span><span class="p">:</span> <span class="n">collections</span><span class="p">)</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">return</span> <span class="nb">super</span><span class="p">.</span><span class="n">traitCollection</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>We override trait collection in <code>UIWindow</code> just for iPhone 6+ model. Now we can make layout changes in storyboard directly for this model by changing size class selectors at the bottom of Interface Builder pane. Trait collection with horizontal compact class and vertical compact class is reserved for iPhone 6+.</p>

<p><img class="center" src="http://nshint.github.io/images/uitraitcollection_trick/2.png"></p>

<p>We can install additional views and change layout constraints only for iPhone 6+.</p>

<p><img class="center" src="http://nshint.github.io/images/uitraitcollection_trick/3.png"><br/>
<img class="center" src="http://nshint.github.io/images/uitraitcollection_trick/4.png"></p>

<p>Tell your designer about that cool hint and you will probably get some treats. The project shown above can be found on <a href="https://github.com/nshintio/uitraitcollection-trick">GitHub</a>.</p>
]]></content>
    
  </entry>
  
  <entry>
    
    <title type="html"><![CDATA[Logging excessive blocks on the main thread]]></title>
    <link href="http://nshint.github.io/blog/2015/09/14/logging-excessive-blocks-on-the-main-thread/"/>
    
    <updated>2015-09-14T01:30:09+02:00</updated>
    <id>http://nshint.github.io/blog/2015/09/14/logging-excessive-blocks-on-the-main-thread</id>
    
    <content type="html"><![CDATA[<p>Logging excessive blocks on the main thread</p>

<p>Having an application running at 60 FPS is every programmers dream, and users delight.
The worst users experience ever is a frozen and unresponsive screen. It&rsquo;s a dreadful crime in mobile world nowadays. Users try to interact at any moment and according to Murphy’s law they will find all your mistakes. So, you better keep the main thread slim.</p>

<!--more-->


<p>To keep things smoothly in the users interface, every single operation that&rsquo;s schedule to run into the main thread can take longer than 16 milliseconds, and there&rsquo;s a handy solution to get you covered. It&rsquo;s a little library called <a href="https://github.com/wojteklu/Watchdog">Watchdog</a>.</p>

<p>Watchdog is a very simple and straightforward library that logs excessive blocking on the main thread. Let&rsquo;s take a look at how to use it:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='swift'><span class='line'><span class="k">let</span> <span class="n">watchdog</span> <span class="o">=</span> <span class="n">Watchdog</span><span class="p">(</span><span class="mf">0.2</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>Just instantiate it with a number of seconds that you want for Watchdog to consider that the main thread blocked. Also don&rsquo;t forget to retain Watchdog somewhere or it will get released when it goes out of scope. Whenever the main thread is blocked for more than the value previously defined, it will print out logs, just like this:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='swift'><span class='line'><span class="err">👮</span> <span class="n">Main</span> <span class="kr">thread</span> <span class="n">was</span> <span class="n">blocked</span> <span class="k">for</span> <span class="mf">1.25</span><span class="n">s</span> <span class="err">👮</span>
</span></code></pre></td></tr></table></div></figure>


<p>Pretty nice debugging tool!</p>
]]></content>
    
  </entry>
  
  <entry>
    
    <title type="html"><![CDATA[Autolayout and NSLocalizedString]]></title>
    <link href="http://nshint.github.io/blog/2015/09/02/autolayout-and-nslocalizedstring/"/>
    
    <updated>2015-09-02T20:00:52+02:00</updated>
    <id>http://nshint.github.io/blog/2015/09/02/autolayout-and-nslocalizedstring</id>
    
    <content type="html"><![CDATA[<p>A localized application is the one that has all of its texts, translated into the users device current language. And this, for us developers, means one thing, and one thing only. Nightmare.</p>

<p>Every time a new translation comes, it&rsquo;s necessary to run the application and check for broken layouts. Take this quite simple UI.</p>

<!--more-->


<p><img class="center" src="http://nshint.github.io/images/autolayout-and-nslocalizedstrings/01.png" width="375"></p>

<p>Simple, huh?</p>

<p>All right, here&rsquo;s what you have to do to get covered with future translations, and avoid autolayout nightmares.</p>

<p>Add <code>-NSDoubleLocalizedStrings YES</code> to <code>Arguments Passed On Launch</code> to the <code>Run</code> section at your <code>Project Schemes</code>.</p>

<p><img class="center" src="http://nshint.github.io/images/autolayout-and-nslocalizedstrings/02.png"></p>

<p>This argument will duplicate all strings loaded using <code>NSLocalizedString</code>.</p>

<p><img class="center" src="http://nshint.github.io/images/autolayout-and-nslocalizedstrings/03.png" width="375"></p>

<p>What&rsquo;s better then that? What about finding out unlocalized strings?</p>

<p>So, <code>-NSShowNonLocalizedStrings YES</code> comes to rescue!</p>

<p>Great! Now you go and get yourself a cup of coffee while the translation team does their job :)</p>
]]></content>
    
  </entry>
  
  <entry>
    
    <title type="html"><![CDATA[Don't forget about UIMottionEffect]]></title>
    <link href="http://nshint.github.io/blog/2015/08/24/dont-forget-about-uimotioneffects/"/>
    
    <updated>2015-08-24T20:00:52+02:00</updated>
    <id>http://nshint.github.io/blog/2015/08/24/dont-forget-about-uimotioneffects</id>
    
    <content type="html"><![CDATA[<p><code>UIMotionEffects</code> was first introduced in iOS 7. The <a href="https://developer.apple.com/videos/enterprise/#30">WWDC session</a> which presented this, amongst other cool things, is named Implementing Engaging UI on iOS. Nevertheless, <code>UIMotionEffects</code> is still overlooked. But not today, let&rsquo;s make something cool with it.</p>

<p>Motion effects is an easy way to react to external variations on the device&rsquo;s orientation. To say, <code>UIKit</code> performs UI changes whenever the user tilts the device, vertically or horizontally.</p>

<p>Let&rsquo;s use <code>UIInterpolatingMotionEffect</code> a subclass of <code>UIMotionEffects</code>, with <code>MapKit</code>. Notice how appealing it is.</p>

<!--more-->


<p><img class="center" src="http://nshint.github.io/images/dont-forget-about-motion-effects/01.gif"></p>

<p>Sweet, right?</p>

<p>Achieving it, is easier than you think. Just a few lines of code and you&rsquo;re good to go:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='swift'><span class='line'><span class="k">var</span> <span class="n">horizontalMotionEffect</span> <span class="o">=</span> <span class="bp">UIInterpolatingMotionEffect</span><span class="p">(</span><span class="nl">keyPath</span><span class="p">:</span> <span class="s">&quot;center.x&quot;</span><span class="p">,</span> <span class="nl">type</span><span class="p">:</span> <span class="p">.</span><span class="n">TiltAlongHorizontalAxis</span><span class="p">)</span>
</span><span class='line'><span class="n">horizontalMotionEffect</span><span class="p">.</span><span class="n">minimumRelativeValue</span> <span class="o">=</span> <span class="o">-</span><span class="mi">100</span>
</span><span class='line'><span class="n">horizontalMotionEffect</span><span class="p">.</span><span class="n">maximumRelativeValue</span> <span class="o">=</span> <span class="mi">100</span>
</span><span class='line'>
</span><span class='line'><span class="n">mapView</span><span class="p">.</span><span class="n">addMotionEffect</span><span class="p">(</span><span class="n">horizontalMotionEffect</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>Think of <code>minimumRelativeValue</code> and <code>maximumRelativeValue</code> as leading and tralling constraints, respectivily, to its <code>superview</code>.</p>

<p>That&rsquo;s why you have to create the <code>UIView</code>, <code>MKMapView</code> in this case, outside its <code>superview</code>s bounds. Like so:</p>

<p><img class="center" src="http://nshint.github.io/images/dont-forget-about-motion-effects/02.png"></p>

<p>As the user tilts the device, <code>UIInterpolatingMotionEffect</code> translates the fixed offset values returned by the system to the range of specified values, then <code>UIKit</code> applies the translated values to any target views.</p>

<p>Don’t forget about this! Details matters and it&rsquo;s what users love in mobile apps!</p>
]]></content>
    
  </entry>
  
  <entry>
    
    <title type="html"><![CDATA[Autolayout breakpoints]]></title>
    <link href="http://nshint.github.io/blog/2015/08/17/autolayout-breakpoints/"/>
    
    <updated>2015-08-17T20:00:52+02:00</updated>
    <id>http://nshint.github.io/blog/2015/08/17/autolayout-breakpoints</id>
    
    <content type="html"><![CDATA[<p>Auto layout has become a crucial tool for iOS and OS X development. It makes creating layout for multiple screen sizes easy peasy. But sometimes it can drive you crazy, with verbose and misleading logs.</p>

<!--more-->


<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>Unable to simultaneously satisfy constraints.
</span><span class='line'>Probably at least one of the constraints in the following list is one you don't want.
</span><span class='line'>Try this:
</span><span class='line'>
</span><span class='line'>(1) look at each constraint and try to figure out which you don't expect;
</span><span class='line'>(2) find the code that added the unwanted constraint or constraints and fix it.
</span><span class='line'>(Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints)
</span><span class='line'>
</span><span class='line'>(...........)
</span><span class='line'>
</span><span class='line'>
</span><span class='line'>Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
</span><span class='line'>The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in &lt;UIKit/UIView.h&gt; may also be helpful.</span></code></pre></td></tr></table></div></figure>


<p>That&rsquo;s a huge log! And I cut off the <code>NSLayoutConstraint</code> part. Yet, the second last line is giving a clue in which direction to go to fix this issue. Symbolic breakpoint at <code>UIViewAlertForUnsatisfiableConstraints</code>.</p>

<p>All right, here&rsquo;s what Xcode want&rsquo;s you to do:</p>

<p><img class="center" src="http://nshint.github.io/images/autolayout-breakpoints/1.png"></p>

<p>Honestly, that won&rsquo;t help much, because basically it&rsquo;ll just stop the execution and leave you up with <code>LLDB</code>, alone in the dark.</p>

<p>But there&rsquo;s a little trick you can do to enhance the preceding symbolic breakpoint.
Adding <code>po [[UIWindow keyWindow] _autolayoutTrace]</code> to it (for Obj-C projects) or <code>expr -l objc++ -O -- [[UIWindow keyWindow] _autolayoutTrace]</code> (for Swift projects).</p>

<p><img class="center" src="http://nshint.github.io/images/autolayout-breakpoints/2.png"></p>

<p>Now, on console, you&rsquo;ll see all the <code>UIView</code> hierarchy and exactly where it has ambiguity.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="nl">UIWindow</span><span class="p">:</span><span class="mh">0x7f9481c93360</span>
</span><span class='line'><span class="o">|</span>   <span class="err">•</span><span class="nl">UIView</span><span class="p">:</span><span class="mh">0x7f9481c9d680</span>
</span><span class='line'><span class="o">|</span>   <span class="o">|</span>   <span class="o">*</span><span class="nl">UIView</span><span class="p">:</span><span class="mh">0x7f9481c9d990</span><span class="o">-</span> <span class="n">AMBIGUOUS</span> <span class="n">LAYOUT</span> <span class="k">for</span> <span class="nl">UIView</span><span class="p">:</span><span class="mh">0x7f9481c9d990</span><span class="p">.</span><span class="n">minX</span><span class="p">{</span><span class="kt">id</span><span class="o">:</span> <span class="mi">13</span><span class="p">},</span> <span class="nl">UIView</span><span class="p">:</span><span class="mh">0x7f9481c9d990</span><span class="p">.</span><span class="n">minY</span><span class="p">{</span><span class="kt">id</span><span class="o">:</span> <span class="mi">16</span><span class="p">}</span>
</span><span class='line'><span class="o">|</span>   <span class="o">|</span>   <span class="o">*</span><span class="nl">_UILayoutGuide</span><span class="p">:</span><span class="mh">0x7f9481c9e160</span><span class="o">-</span> <span class="n">AMBIGUOUS</span> <span class="n">LAYOUT</span> <span class="k">for</span> <span class="nl">_UILayoutGuide</span><span class="p">:</span><span class="mh">0x7f9481c9e160</span><span class="p">.</span><span class="n">minY</span><span class="p">{</span><span class="kt">id</span><span class="o">:</span> <span class="mi">17</span><span class="p">}</span>
</span><span class='line'><span class="o">|</span>   <span class="o">|</span>   <span class="o">*</span><span class="nl">_UILayoutGuide</span><span class="p">:</span><span class="mh">0x7f9481c9ebb0</span><span class="o">-</span> <span class="n">AMBIGUOUS</span> <span class="n">LAYOUT</span> <span class="k">for</span> <span class="nl">_UILayoutGuide</span><span class="p">:</span><span class="mh">0x7f9481c9ebb0</span><span class="p">.</span><span class="n">minY</span><span class="p">{</span><span class="kt">id</span><span class="o">:</span> <span class="mi">27</span><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Note that as you hit continue it&rsquo;ll stop at every ambiguous layout you may have.
And if that&rsquo;s not enough for you to find out your autolayout issue, try changing the view&rsquo;s color, who knows?</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="p">(</span><span class="n">lldb</span><span class="p">)</span> <span class="n">expr</span> <span class="p">((</span><span class="bp">UIView</span> <span class="o">*</span><span class="p">)</span><span class="mh">0x7f9ea3d43410</span><span class="p">).</span><span class="n">backgroundColor</span> <span class="o">=</span> <span class="p">[</span><span class="bp">UIColor</span> <span class="n">redColor</span><span class="p">]</span>
</span><span class='line'><span class="p">(</span><span class="n">UICachedDeviceRGBColor</span> <span class="o">*</span><span class="p">)</span> <span class="err">$</span><span class="mi">1</span> <span class="o">=</span> <span class="mh">0x00007f9ea3d43410</span>
</span></code></pre></td></tr></table></div></figure>


<p>Fear no more young Padawan, make symbolic breakpoints and <code>LLDB</code> work for you!</p>

<p>I would like to thank <a href="https://twitter.com/PorterHoskins">Porter Hoskins</a> for pointing out the correct <code>LLDB</code> command for Swift.</p>
]]></content>
    
  </entry>
  
  <entry>
    
    <title type="html"><![CDATA[NSProgressReporting]]></title>
    <link href="http://nshint.github.io/blog/2015/08/09/nsprogressreporting/"/>
    
    <updated>2015-08-09T20:00:52+02:00</updated>
    <id>http://nshint.github.io/blog/2015/08/09/nsprogressreporting</id>
    
    <content type="html"><![CDATA[<p>In iOS7 and OS X 10.9 Apple released NSProgess. Its a nice, helpful piece of code that was supposed to make our coding lifes easier.
If you finally <a href="http://oleb.net/blog/2014/03/nsprogress/">find a proper way to use it</a> it can be very beneficial.</p>

<p>Besides of helpfull UserInfo object keys which give us comprehensive text information about progress of our tasks in proper language, NSProgress was supposed to provide us way of compositioning objects into trees. However, first version of class allowed this in an implicit way which does not look very clear first time you learn it.</p>

<!--more-->


<p>I will try to present it to you in a short way:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='swift'><span class='line'><span class="k">let</span> <span class="n">parentProgress</span> <span class="o">=</span> <span class="bp">NSProgress</span><span class="p">()</span>
</span><span class='line'><span class="n">parentProgress</span><span class="p">.</span><span class="n">totalUnitCount</span> <span class="o">=</span> <span class="mi">2</span>
</span><span class='line'><span class="n">parentProgress</span><span class="p">.</span><span class="n">becomeCurrentWithPendingUnitCount</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="k">let</span> <span class="n">childProgress</span> <span class="o">=</span> <span class="bp">NSProgress</span><span class="p">(</span><span class="nl">totalUnitCount</span><span class="p">:</span><span class="mi">1</span><span class="p">)</span>
</span><span class='line'><span class="n">parentProgress</span><span class="p">.</span><span class="n">resignCurrent</span><span class="p">()</span>
</span></code></pre></td></tr></table></div></figure>


<p>When applying this approach you have to create child progress using totalUnitCount convenience constructor immediately. You also should document that you support implicit composition in a clear way.</p>

<p>OSX 10.11 and iOS 9.0 provides more explicit way for creating tree structure of NSProgress objects. Things are simple now:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='swift'><span class='line'><span class="k">let</span> <span class="n">parentProgress</span> <span class="o">=</span> <span class="bp">NSProgress</span><span class="p">()</span>
</span><span class='line'><span class="k">let</span> <span class="n">childProgress</span> <span class="o">=</span> <span class="bp">NSProgress</span><span class="p">()</span>
</span><span class='line'><span class="n">parentProgress</span><span class="p">.</span><span class="n">addChild</span><span class="p">(</span><span class="n">childProgress</span><span class="p">,</span> <span class="nl">withPendingUnitCount</span><span class="p">:</span><span class="mi">1</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>There is also one more thing useful thing in process of forwarding progress through our app architecture. When any of your classes is free to attend in NSProgress family tree, simply implement following protocol:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='swift'><span class='line'><span class="k">protocol</span> <span class="nl">NSProgressReporting</span> <span class="p">:</span> <span class="n">NSObjectProtocol</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">var</span> <span class="nl">progress</span><span class="p">:</span> <span class="bp">NSProgress</span> <span class="p">{</span> <span class="kr">get</span> <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>This way we are able to easily track progress of tree structure of tasks and get our overall progress in an easy, object oriented way.</p>
]]></content>
    
  </entry>
  
  <entry>
    
    <title type="html"><![CDATA[Using sql as date formatter]]></title>
    <link href="http://nshint.github.io/blog/2015/08/04/using-sql-as-date-formatter/"/>
    
    <updated>2015-08-04T20:50:51+02:00</updated>
    <id>http://nshint.github.io/blog/2015/08/04/using-sql-as-date-formatter</id>
    
    <content type="html"><![CDATA[<p>This post is a quick update to <a href="http://vombat.tumblr.com/post/60530544401/date-parsing-performance-on-ios-nsdateformatter">Vombat&rsquo;s blog post</a> about using SQL instead of <code>NSDateFormatter</code> when it comes to parsing dates in your project. If you don&rsquo;t read it yet, I will highly recommend to do it now. This time we will use Swift to make same measurements.</p>

<!--more-->


<p>TL;DR:</p>

<p>You can use sql database function <code>strftime</code> to get UNIX time from e.g.: ISO8061 date string.</p>

<p>Here is the magic function:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="p">+</span> <span class="p">(</span><span class="bp">NSArray</span> <span class="o">*</span><span class="p">)</span><span class="nf">parseDatesUsingStringArray:</span><span class="p">(</span><span class="bp">NSArray</span> <span class="o">*</span><span class="p">)</span><span class="nv">stringsArray</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="n">sqlite3</span> <span class="o">*</span><span class="n">db</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>
</span><span class='line'>    <span class="n">sqlite3_open</span><span class="p">(</span><span class="s">&quot;:memory:&quot;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">db</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">sqlite3_stmt</span> <span class="o">*</span><span class="n">statement</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>
</span><span class='line'>    <span class="n">sqlite3_prepare_v2</span><span class="p">(</span><span class="n">db</span><span class="p">,</span> <span class="s">&quot;SELECT strftime(&#39;%s&#39;, ?);&quot;</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">statement</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="bp">NSMutableArray</span> <span class="o">*</span><span class="n">datesArray</span> <span class="o">=</span> <span class="p">[</span><span class="bp">NSMutableArray</span> <span class="n">array</span><span class="p">];</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">for</span> <span class="p">(</span><span class="bp">NSInteger</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">stringsArray</span><span class="p">.</span><span class="n">count</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="bp">NSString</span> <span class="o">*</span><span class="n">dateString</span> <span class="o">=</span> <span class="n">stringsArray</span><span class="p">[</span><span class="n">i</span><span class="p">];</span>
</span><span class='line'>
</span><span class='line'>        <span class="n">sqlite3_bind_text</span><span class="p">(</span><span class="n">statement</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="p">[</span><span class="n">dateString</span> <span class="n">UTF8String</span><span class="p">],</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="n">SQLITE_STATIC</span><span class="p">);</span>
</span><span class='line'>        <span class="n">sqlite3_step</span><span class="p">(</span><span class="n">statement</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>        <span class="n">kTimeStamp</span> <span class="n">value</span> <span class="o">=</span> <span class="n">sqlite3_column_int64</span><span class="p">(</span><span class="n">statement</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span><span class='line'>        <span class="bp">NSDate</span> <span class="o">*</span><span class="n">date</span> <span class="o">=</span> <span class="p">[</span><span class="bp">NSDate</span> <span class="nl">dateWithTimeIntervalSince1970</span><span class="p">:</span><span class="n">value</span><span class="p">];</span>
</span><span class='line'>
</span><span class='line'>        <span class="p">[</span><span class="n">datesArray</span> <span class="nl">addObject</span><span class="p">:</span><span class="n">date</span><span class="p">];</span>
</span><span class='line'>
</span><span class='line'>        <span class="n">sqlite3_clear_bindings</span><span class="p">(</span><span class="n">statement</span><span class="p">);</span>
</span><span class='line'>        <span class="n">sqlite3_reset</span><span class="p">(</span><span class="n">statement</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">sqlite3_close</span><span class="p">(</span><span class="n">db</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">return</span> <span class="n">datesArray</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>We will use it to replace standard parsing method like this:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='swift'><span class='line'><span class="k">var</span> <span class="nl">datesFromNSDateFormatter</span><span class="p">:[</span><span class="bp">NSDate</span><span class="p">]</span> <span class="o">=</span> <span class="p">[]</span>
</span><span class='line'>
</span><span class='line'><span class="k">for</span> <span class="n">string</span> <span class="k">in</span> <span class="n">stringsArray</span> <span class="p">{</span>
</span><span class='line'>  <span class="n">datesFromNSDateFormatter</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="bp">NSDateFormatter</span><span class="p">.</span><span class="n">dateFromISOString</span><span class="p">(</span><span class="n">string</span><span class="p">))</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>I did some measurements using iPhone 5S with iOS8.2 in release configuration running exactly same amount of data (One Milion strings with ISO8601 date)</p>

<p>And here are the results:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='swift'><span class='line'><span class="n">Time</span> <span class="n">elapsed</span> <span class="k">for</span> <span class="n">NSDateFromatter</span> <span class="nl">parsing</span><span class="p">:</span> <span class="mf">73.7988719940186</span> <span class="n">s</span>
</span><span class='line'><span class="n">Time</span> <span class="n">elapsed</span> <span class="k">for</span> <span class="n">SQLDateFormatter</span> <span class="nl">parsing</span><span class="p">:</span> <span class="mf">8.51147103309631</span> <span class="n">s</span>
</span></code></pre></td></tr></table></div></figure>


<p>So using SQL to format string into date is pretty fast but acutally slower than objC version (But still at least 10time faster than regular method) So what about Swift?. Nothing really changed, overall results show faster computation but I&rsquo;m using better CPU so <code>NSDateFormatter</code> is still very very slow&hellip; If you like it, sample source code is available on <a href="https://github.com/noxytrux/DateFormatter">Github</a></p>
]]></content>
    
  </entry>
  
  <entry>
    
    <title type="html"><![CDATA[Law Of Demeter]]></title>
    <link href="http://nshint.github.io/blog/2015/08/03/law-of-demeter/"/>
    
    <updated>2015-08-03T13:24:06+02:00</updated>
    <id>http://nshint.github.io/blog/2015/08/03/law-of-demeter</id>
    
    <content type="html"><![CDATA[<p>You may haven&rsquo;t heard about this law or if you have, you may have wondered <a href="http://homepages.cwi.nl/~storm/teaching/reader/LieberherrHolland89.pdf">who&rsquo;s this Demeter guy</a>. Regardless of it, the Law Of Demeter (LoD) is a foundation concept that&rsquo;s used among several design patterns, to wit: Delegate, Proxy, Façade, Adapter and Decorator. Therefore, you probably are already taking advantage of this Law, knowing it or not.</p>

<!--more-->


<p>There&rsquo;s a particular situation that occurs with iOS, that&rsquo;s perfect for applying the LoD. Sometimes it&rsquo;s needed to call method in our <code>UIApplicationDelegate</code>. The common way of doing that is the following:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='swift'><span class='line'><span class="k">let</span> <span class="n">sharedApplication</span> <span class="o">=</span> <span class="bp">UIApplication</span><span class="p">.</span><span class="n">sharedApplication</span><span class="p">()</span>
</span><span class='line'><span class="k">let</span> <span class="n">delegate</span> <span class="o">=</span> <span class="n">sharedApplication</span><span class="p">.</span><span class="n">delegate</span>
</span><span class='line'><span class="k">if</span> <span class="k">let</span> <span class="n">delegate</span> <span class="o">=</span> <span class="n">delegate</span> <span class="kt">as</span><span class="o">?</span> <span class="n">AppDelegate</span> <span class="p">{</span>
</span><span class='line'>    <span class="n">delegate</span><span class="p">.</span><span class="n">doSomething</span><span class="p">()</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>There are too many temporary objects, and presumably, there&rsquo;s no reason why this class should know about <code>AppDelegate</code> casting and so on.</p>

<p>Using the <code>Decorator</code> pattern, is a way to wrap up this logic and decouple stuff.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='swift'><span class='line'><span class="k">extension</span> <span class="bp">UIApplication</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">class</span> <span class="k">func</span> <span class="n">myDelegate</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="n">AppDelegate</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="p">(</span><span class="nb">self</span><span class="p">.</span><span class="n">sharedApplication</span><span class="p">().</span><span class="n">delegate</span> <span class="kt">as</span><span class="o">!</span> <span class="n">AppDelegate</span><span class="p">)</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="k">class</span> <span class="k">func</span> <span class="n">doSomething</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="n">myDelegate</span><span class="p">().</span><span class="n">doSomething</span><span class="p">()</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">extension</span> <span class="n">AppDelegate</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">class</span> <span class="k">func</span> <span class="n">doSomething</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="bp">UIApplication</span><span class="p">.</span><span class="n">doSomething</span><span class="p">()</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now the class would just call <code>UIApplication.doSomething()</code> or <code>AppDelegate.doSomething()</code>.</p>

<p>Another situation that&rsquo;s a claimer for LoD is when you have chained &lsquo;get&rsquo; statements, for example:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='swift'><span class='line'><span class="k">let</span> <span class="n">myDesire</span> <span class="o">=</span> <span class="n">Metallica</span><span class="p">().</span><span class="n">gimmeFuel</span><span class="p">().</span><span class="n">gimmeFire</span><span class="p">().</span><span class="n">gimmeThatWhichIDesire</span><span class="p">()</span>
</span></code></pre></td></tr></table></div></figure>


<p>In such a case, the <code>Metallica</code> class should be refactored and provide it with a mean of calling <code>Metallica().gimmeThatWhichIDesire()</code>, for example:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='swift'><span class='line'><span class="k">class</span> <span class="n">Metallica</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">func</span> <span class="n">fuelSetOnFire</span><span class="p">(</span><span class="nl">fuel</span><span class="p">:</span> <span class="n">Fuel</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Fire</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">return</span> <span class="n">Fire</span><span class="p">.</span><span class="n">setFuelOnFire</span><span class="p">(</span><span class="n">fuel</span><span class="p">)</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">func</span> <span class="n">gimmeThatWhichIDesire</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="n">Desire</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">Desire</span><span class="p">.</span><span class="n">fromFire</span><span class="p">(</span><span class="n">fuelSetOnFire</span><span class="p">(</span><span class="n">metallicasFuel</span><span class="p">))</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Wrapping up method calls, separating concerns and decoupling classes are the spine of LoD. Some can say that objects become more complex, but one thing is for sure, your software components will be more testable, and that is a big win!</p>

<p>Now go ahead and follow the rule!</p>
]]></content>
    
  </entry>
  
  <entry>
    
    <title type="html"><![CDATA[Run Script Phase reporting]]></title>
    <link href="http://nshint.github.io/blog/2015/07/23/run-script-phase-reporting/"/>
    
    <updated>2015-07-23T13:24:06+02:00</updated>
    <id>http://nshint.github.io/blog/2015/07/23/run-script-phase-reporting</id>
    
    <content type="html"><![CDATA[<p>Bash scripts are commonly used in Mac/iOS development to make repetitive operations hands-free. However sometimes things go wrong and in a perfect world I’d like to be properly informed about the errors.
Here comes view called „Report Navigator”, which displays any type of errors, warnings at compile time of Objective-C/Swift, or even while typing new lines of code. Let me show how to use the Report Navigator.</p>

<!--more-->


<p>As usual create new <code>Run Script Phase</code> and insert your Bash script:</p>

<p><img class="center" src="http://nshint.github.io/images/bash-scripts-marks/bash-scripts-new-script-phase.png"></p>

<p>To keep this blog post short, I&rsquo;ve created a simple script that checks which build configurations were used:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nb">echo</span> <span class="s2">&quot;note: Starting script phase.”</span>
</span><span class='line'><span class="s2">echo &quot;</span>warning: testing <span class="k">for</span> Debug target<span class="s2">&quot;</span>
</span><span class='line'>
</span><span class='line'><span class="s2">if [ &quot;</span>Debug<span class="s2">&quot;= &quot;</span><span class="k">${</span><span class="nv">CONFIGURATION</span><span class="k">}</span><span class="s2">&quot; ];</span>
</span><span class='line'><span class="s2">then</span>
</span><span class='line'><span class="s2">    echo &quot;</span>error: please run this script on Release target<span class="s2">&quot;</span>
</span><span class='line'><span class="s2">else</span>
</span><span class='line'><span class="s2">    echo &quot;</span>warning: running on Debug target<span class="err">&quot;</span>
</span><span class='line'><span class="k">fi</span>
</span></code></pre></td></tr></table></div></figure>


<p>Please, take a look in every echo at <code>note:</code>, <code>warning:</code> and <code>error:</code> prefixes. When XCode recognizes any of these tags, the proper indicator will show up in Report Navigator and of course at the top bar:</p>

<p><img class="center" src="http://nshint.github.io/images/bash-scripts-marks/bash-scripts-error-navigator.png"></p>

<p>Pay attention to the colon at the end of each tag. Tags can be placed anywhere in the message.</p>
]]></content>
    
  </entry>
  
  <entry>
    
    <title type="html"><![CDATA[UICollectionViews now have easy reordering]]></title>
    <link href="http://nshint.github.io/blog/2015/07/16/uicollectionviews-now-have-easy-reordering/"/>
    
    <updated>2015-07-16T01:30:09+02:00</updated>
    <id>http://nshint.github.io/blog/2015/07/16/uicollectionviews-now-have-easy-reordering</id>
    
    <content type="html"><![CDATA[<p>I&rsquo;m a huge fan of <code>UICollectionView</code>. It&rsquo;s way more customizable than his older brother <code>UITableView</code>. Nowadays I use collection view even more often than table view. With iOS 9 it supports easy reordering. Before it wasn&rsquo;t possible out of the box, and to do so means painful work. Let&rsquo;s have look at the API. You can find the accompanying Xcode project <a href="https://github.com/nshint/uicollectionview-reordering">on GitHub</a>.</p>

<!--more-->


<p>The easiest way to add easy reordering is to use <code>UICollectionViewController</code>. It now has a new property called <code>installsStandardGestureForInteractiveMovement</code> which adds standard gestures to reorder cells. This property is <code>true</code> by default, which means that there&rsquo;s only one method we should to override to get things working.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='swift'><span class='line'><span class="kr">override</span> <span class="k">func</span> <span class="nf">collectionView</span><span class="p">(</span><span class="nl">collectionView</span><span class="p">:</span> <span class="bp">UICollectionView</span><span class="p">,</span>
</span><span class='line'>    <span class="n">moveItemAtIndexPath</span> <span class="nl">sourceIndexPath</span><span class="p">:</span> <span class="bp">NSIndexPath</span><span class="p">,</span>
</span><span class='line'>    <span class="n">toIndexPath</span> <span class="nl">destinationIndexPath</span><span class="p">:</span> <span class="bp">NSIndexPath</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="c1">// move your data order</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>The collection view infers that items can be moved because <code>moveItemAtIndexPath</code> is overrired.</p>

<p><img class="center" src="http://nshint.github.io/images/uicollectionview-reordering/1.gif"></p>

<p>Things go complicated when we want to use a simple <code>UIViewController</code> with collection view. We also need to implement <code>UICollectionViewDataSource</code> methods mentioned above, but we need to rewrite <code>installsStandardGestureForInteractiveMovement</code>. No worries, it&rsquo;s also easily supported.<code>UILongPressGestureRecognizer</code> is a continuous gesture recognizer and fully supports panning.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
</pre></td><td class='code'><pre><code class='swift'><span class='line'><span class="kr">override</span> <span class="k">func</span> <span class="nf">viewDidLoad</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="nb">super</span><span class="p">.</span><span class="n">viewDidLoad</span><span class="p">()</span>
</span><span class='line'>
</span><span class='line'>            <span class="n">longPressGesture</span> <span class="o">=</span> <span class="bp">UILongPressGestureRecognizer</span><span class="p">(</span><span class="nl">target</span><span class="p">:</span> <span class="nb">self</span><span class="p">,</span> <span class="nl">action</span><span class="p">:</span> <span class="s">&quot;handleLongGesture:&quot;</span><span class="p">)</span>
</span><span class='line'>        <span class="nb">self</span><span class="p">.</span><span class="n">collectionView</span><span class="p">.</span><span class="n">addGestureRecognizer</span><span class="p">(</span><span class="n">longPressGesture</span><span class="p">)</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">func</span> <span class="nf">handleLongGesture</span><span class="p">(</span><span class="nl">gesture</span><span class="p">:</span> <span class="bp">UILongPressGestureRecognizer</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">switch</span><span class="p">(</span><span class="n">gesture</span><span class="p">.</span><span class="n">state</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">case</span> <span class="n">UIGestureRecognizerState</span><span class="p">.</span><span class="nl">Began</span><span class="p">:</span>
</span><span class='line'>            <span class="n">guard</span> <span class="k">let</span> <span class="n">selectedIndexPath</span> <span class="o">=</span> <span class="nb">self</span><span class="p">.</span><span class="n">collectionView</span><span class="p">.</span><span class="n">indexPathForItemAtPoint</span><span class="p">(</span><span class="n">gesture</span><span class="p">.</span><span class="n">locationInView</span><span class="p">(</span><span class="nb">self</span><span class="p">.</span><span class="n">collectionView</span><span class="p">))</span> <span class="k">else</span> <span class="p">{</span>
</span><span class='line'>                <span class="k">break</span>
</span><span class='line'>            <span class="p">}</span>
</span><span class='line'>            <span class="n">collectionView</span><span class="p">.</span><span class="n">beginInteractiveMovementForItemAtIndexPath</span><span class="p">(</span><span class="n">selectedIndexPath</span><span class="p">)</span>
</span><span class='line'>        <span class="k">case</span> <span class="n">UIGestureRecognizerState</span><span class="p">.</span><span class="nl">Changed</span><span class="p">:</span>
</span><span class='line'>            <span class="n">collectionView</span><span class="p">.</span><span class="n">updateInteractiveMovementTargetPosition</span><span class="p">(</span><span class="n">gesture</span><span class="p">.</span><span class="n">locationInView</span><span class="p">(</span><span class="n">gesture</span><span class="p">.</span><span class="n">view</span><span class="o">!</span><span class="p">))</span>
</span><span class='line'>        <span class="k">case</span> <span class="n">UIGestureRecognizerState</span><span class="p">.</span><span class="nl">Ended</span><span class="p">:</span>
</span><span class='line'>            <span class="n">collectionView</span><span class="p">.</span><span class="n">endInteractiveMovement</span><span class="p">()</span>
</span><span class='line'>        <span class="k">default</span><span class="o">:</span>
</span><span class='line'>            <span class="n">collectionView</span><span class="p">.</span><span class="n">cancelInteractiveMovement</span><span class="p">()</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>We stored selected index path obtained in long press gesture handler and depending on wether it has any value we allow to pan gesture to kick in. Then, we call some new collection view methods accordingly to the gesture state:</p>

<ul>
<li><code>beginInteractiveMovementForItemAtIndexPath(indexPath: NSIndexPath)</code> which starts interactive movement for cell at specific index path</li>
<li><code>updateInteractiveMovementTargetPosition(targetPosition: CGPoint)</code> which updates interactive movement target position during gesture</li>
<li><code>endInteractiveMovement()</code> which ends interactive movement after you finish pan gesture</li>
<li><code>cancelInteractiveMovement()</code> which cancels interactive movement</li>
</ul>


<p>And this makes handling pan gesture obvious.</p>

<p><img class="center" src="http://nshint.github.io/images/uicollectionview-reordering/2.gif"></p>

<p>The behavior is the same as with standard <code>UICollectionViewController</code>. Really cool, but what makes it even cooler is that we can apply reordering to collection view with our custom collection view layout. Check interactive movement with simple waterfall layout.</p>

<p><img class="center" src="http://nshint.github.io/images/uicollectionview-reordering/3.gif"></p>

<p>Uhm, looks cool, but what if we don&rsquo;t want to change cell size during movement? Selected cell size during interactive movement should remain the same. This is possible. <code>UICollectionViewLayout</code> also gets additional methods to handle reordering.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='swift'><span class='line'><span class="k">func</span> <span class="n">invalidationContextForInteractivelyMovingItems</span><span class="p">(</span><span class="nl">targetIndexPaths</span><span class="p">:</span> <span class="p">[</span><span class="bp">NSIndexPath</span><span class="p">],</span>
</span><span class='line'>    <span class="n">withTargetPosition</span> <span class="nl">targetPosition</span><span class="p">:</span> <span class="bp">CGPoint</span><span class="p">,</span>
</span><span class='line'>    <span class="nl">previousIndexPaths</span><span class="p">:</span> <span class="p">[</span><span class="bp">NSIndexPath</span><span class="p">],</span>
</span><span class='line'>    <span class="nl">previousPosition</span><span class="p">:</span> <span class="bp">CGPoint</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="bp">UICollectionViewLayoutInvalidationContext</span>
</span><span class='line'>
</span><span class='line'><span class="k">func</span> <span class="n">invalidationContextForEndingInteractiveMovementOfItemsToFinalIndexPaths</span><span class="p">(</span><span class="nl">indexPaths</span><span class="p">:</span> <span class="p">[</span><span class="bp">NSIndexPath</span><span class="p">],</span>
</span><span class='line'>    <span class="nl">previousIndexPaths</span><span class="p">:</span> <span class="p">[</span><span class="bp">NSIndexPath</span><span class="p">],</span>
</span><span class='line'>    <span class="nl">movementCancelled</span><span class="p">:</span> <span class="n">Bool</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="bp">UICollectionViewLayoutInvalidationContext</span>
</span></code></pre></td></tr></table></div></figure>


<p>The former is called during the cells interactive movement with target and previous cell&rsquo;s indexPaths. The next one is similar, but it&rsquo;s called just after interactive movement ends. With this knowledge we can achieve our requirement using one little trick.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='swift'><span class='line'><span class="n">internal</span> <span class="kr">override</span> <span class="k">func</span> <span class="n">invalidationContextForInteractivelyMovingItems</span><span class="p">(</span><span class="nl">targetIndexPaths</span><span class="p">:</span> <span class="p">[</span><span class="bp">NSIndexPath</span><span class="p">],</span>
</span><span class='line'>    <span class="n">withTargetPosition</span> <span class="nl">targetPosition</span><span class="p">:</span> <span class="bp">CGPoint</span><span class="p">,</span>
</span><span class='line'>    <span class="nl">previousIndexPaths</span><span class="p">:</span> <span class="p">[</span><span class="bp">NSIndexPath</span><span class="p">],</span>
</span><span class='line'>    <span class="nl">previousPosition</span><span class="p">:</span> <span class="bp">CGPoint</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="bp">UICollectionViewLayoutInvalidationContext</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">var</span> <span class="n">context</span> <span class="o">=</span> <span class="nb">super</span><span class="p">.</span><span class="n">invalidationContextForInteractivelyMovingItems</span><span class="p">(</span><span class="n">targetIndexPaths</span><span class="p">,</span>
</span><span class='line'>        <span class="nl">withTargetPosition</span><span class="p">:</span> <span class="n">targetPosition</span><span class="p">,</span> <span class="nl">previousIndexPaths</span><span class="p">:</span> <span class="n">previousIndexPaths</span><span class="p">,</span>
</span><span class='line'>        <span class="nl">previousPosition</span><span class="p">:</span> <span class="n">previousPosition</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="nb">self</span><span class="p">.</span><span class="n">delegate</span><span class="o">?</span><span class="p">.</span><span class="n">collectionView</span><span class="o">!</span><span class="p">(</span><span class="nb">self</span><span class="p">.</span><span class="n">collectionView</span><span class="o">!</span><span class="p">,</span> <span class="nl">moveItemAtIndexPath</span><span class="p">:</span> <span class="n">previousIndexPaths</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span>
</span><span class='line'>        <span class="nl">toIndexPath</span><span class="p">:</span> <span class="n">targetIndexPaths</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">return</span> <span class="n">context</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Solution is straightforward. Grab previous and target index paths of currently moving cell. Then call <code>UICollectionViewDataSource</code> method to move this items around.</p>

<p><img class="center" src="http://nshint.github.io/images/uicollectionview-reordering/4.gif"></p>

<p>Without a doubt, a collection view reordering is a fantastic addition. UIKit engineers made awesome job! :)</p>

<p>P.S: I would like to thanks <a href="https://twitter.com/qdoug">Douglas Hill</a> for hinting out some improvements in our code. Thanks Douglas, keep up the good work!</p>
]]></content>
    
  </entry>
  
  <entry>
    
    <title type="html"><![CDATA[Shared breakpoints]]></title>
    <link href="http://nshint.github.io/blog/2015/07/12/shared-breakpoints/"/>
    
    <updated>2015-07-12T14:00:40-03:00</updated>
    <id>http://nshint.github.io/blog/2015/07/12/shared-breakpoints</id>
    
    <content type="html"><![CDATA[<p>Developing multithreaded application is not something new and it&rsquo;s become more and more popular with multicore processors. One thing it&rsquo;s for sure, debugging multithread applications is tough.</p>

<p>iOS has some gotchas regarding multithread, things that if you don&rsquo;t respect, may cause your application to crash or hang the users interface, for example:</p>

<!--more-->


<ul>
<li>Animations outside the main thread, may crash the application.<br/></li>
<li>Performing network requests on the main thread, will hang the users interface.<br/></li>
</ul>


<p><img class="left" src="http://nshint.github.io/images/shared-breakpoints/1.png">
We can solve those situations by using the so called <code>Symbolic Breakpoints</code> and <a href="https://developer.apple.com/library/ios/recipes/xcode_help-breakpoint_navigator/articles/sharing_a_breakpoint.html">share those breakpoints</a> with your team. Thereby, every developer can take advantage of that, and get notified, when they occur.</p>

<p>To help you out, we created a bunch of shared breakpoints and integrate them into your project is very easy:</p>

<p><img class="right" src="http://nshint.github.io/images/shared-breakpoints/2.png">
- Go to your <code>.xcodeproj</code> or <code>.xcworkspace</code> file, right click on it, and choose <code>Show Package Contents</code>.<br/>
- Open the folder <code>xcshareddata</code>, then <code>xcdebugger</code> (create them if not exists).<br/>
- Breakpoints are saved into <code>Breakpoints_v2.xcbkptlist</code>.<br/>
-  Now you just have to paste the following content into the <code>&lt;Breakpoints&gt;</code> node.</p>

<p>(We could also add those by using <a href="https://developer.apple.com/library/mac/documentation/IDEs/Conceptual/gdb_to_lldb_transition_guide/document/lldb-terminal-workflow-tutorial.html"><code>LLDB</code> commands</a>, but those won&rsquo;t show up on the Breakpoints navigator)</p>

<p><img class="center" src="http://nshint.github.io/images/shared-breakpoints/3.png"></p>

<p>Our list of useful breakpoints <a href="https://gist.github.com/rakaramos/d2bc8e75ae68ac830a59">is available here</a></p>

<p>Now, whenever the breakpoint conditions are satisfied, you&rsquo;ll be notified and will have a chance to quickly fix your code, before it crashes into the users hand!</p>

<p><img class="center" src="http://nshint.github.io/images/shared-breakpoints/4.png"></p>
]]></content>
    
  </entry>
  
</feed>

