<?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>2026-09-05T17:56:36+02:00</updated>
  <id>http://nshint.github.io/</id>
  <author>
    <name><![CDATA[NSHint]]></name>
    
  </author>
  <generator uri="https://jekyllrb.com/">Jekyll</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’s assume that you’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>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">enum</span> <span class="kt">Season</span><span class="p">:</span> <span class="kt">String</span><span class="p">,</span> <span class="kt">Decodable</span> <span class="p">{</span>
    <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 class="p">}</span>
</code></pre></div></div>
<!--more-->

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

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">struct</span> <span class="kt">Seasons</span><span class="p">:</span> <span class="kt">Decodable</span> <span class="p">{</span>
    <span class="k">var</span> <span class="nv">available</span><span class="p">:</span> <span class="p">[</span><span class="kt">Season</span><span class="p">]</span>
<span class="p">}</span>
</code></pre></div></div>

<p>The following JSON comes from the server, it gets decoded, everything works well:</p>
<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nl">"available"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">"spring"</span><span class="p">,</span><span class="w"> </span><span class="s2">"summer"</span><span class="p">,</span><span class="w"> </span><span class="s2">"autumn"</span><span class="p">]</span><span class="w">
</span><span class="err">//</span><span class="w"> </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="w"> </span><span class="err">__lldb_expr_</span><span class="mi">12</span><span class="err">.Season.summer</span><span class="p">,</span><span class="w"> </span><span class="err">__lldb_expr_</span><span class="mi">12</span><span class="err">.Season.autumn</span><span class="p">]</span><span class="w">
</span></code></pre></div></div>

<p>The application gets released. Time passes, winter comes and the app gets updated available seasons from the backend:</p>
<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nl">"available"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">"spring"</span><span class="p">,</span><span class="w"> </span><span class="s2">"summer"</span><span class="p">,</span><span class="w"> </span><span class="s2">"autumn"</span><span class="p">,</span><span class="w"> </span><span class="s2">"winter"</span><span class="p">]</span><span class="w">
</span></code></pre></div></div>

<p>What happens now? Your functionality breaks.<br />
Since the app can’t understand <code class="language-plaintext highlighter-rouge">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>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">@propertyWrapper</span>
<span class="kd">struct</span> <span class="kt">IgnoreUnknown</span><span class="o">&lt;</span><span class="kt">Value</span><span class="p">:</span> <span class="kt">Decodable</span><span class="o">&gt;</span><span class="p">:</span> <span class="kt">Decodable</span> <span class="p">{</span>
    <span class="k">var</span> <span class="nv">wrappedValue</span><span class="p">:</span> <span class="p">[</span><span class="kt">Value</span><span class="p">]</span>

    <span class="kd">private</span> <span class="kd">struct</span> <span class="kt">Empty</span><span class="p">:</span> <span class="kt">Decodable</span> <span class="p">{}</span>

    <span class="nf">init</span><span class="p">(</span><span class="n">from</span> <span class="nv">decoder</span><span class="p">:</span> <span class="kt">Decoder</span><span class="p">)</span> <span class="k">throws</span> <span class="p">{</span>
        <span class="k">var</span> <span class="nv">container</span> <span class="o">=</span> <span class="k">try</span> <span class="n">decoder</span><span class="o">.</span><span class="nf">unkeyedContainer</span><span class="p">()</span>
        <span class="k">self</span><span class="o">.</span><span class="n">wrappedValue</span> <span class="o">=</span> <span class="p">[]</span>
        <span class="k">while</span> <span class="o">!</span><span class="n">container</span><span class="o">.</span><span class="n">isAtEnd</span> <span class="p">{</span>
            <span class="k">do</span> <span class="p">{</span>
                <span class="n">wrappedValue</span><span class="o">.</span><span class="nf">append</span><span class="p">(</span><span class="k">try</span> <span class="n">container</span><span class="o">.</span><span class="nf">decode</span><span class="p">(</span><span class="kt">Value</span><span class="o">.</span><span class="k">self</span><span class="p">))</span>
            <span class="p">}</span> <span class="k">catch</span> <span class="p">{</span>
                <span class="n">_</span> <span class="o">=</span> <span class="k">try</span><span class="p">?</span> <span class="n">container</span><span class="o">.</span><span class="nf">decode</span><span class="p">(</span><span class="kt">Empty</span><span class="o">.</span><span class="k">self</span><span class="p">)</span>
            <span class="p">}</span>
        <span class="p">}</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>This way, we simply add <code class="language-plaintext highlighter-rouge">@IgnoreUnknown</code> before our available seasons and voilà! After that, the <code class="language-plaintext highlighter-rouge">available</code> array simply skips the values it cannot understand 🚀</p>
<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">struct</span> <span class="kt">Seasons</span><span class="p">:</span> <span class="kt">Decodable</span> <span class="p">{</span>
    <span class="kd">@IgnoreUnknown</span>
    <span class="k">var</span> <span class="nv">available</span><span class="p">:</span> <span class="p">[</span><span class="kt">Season</span><span class="p">]</span>
<span class="p">}</span>
</code></pre></div></div>

<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’s say we want the name, age, and the password to authenticate the user.
<!--more-->
One way to model it is by using the following data structure:</p>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">struct</span> <span class="kt">FormData</span> <span class="p">{</span>
    <span class="k">let</span> <span class="nv">name</span><span class="p">:</span> <span class="kt">String</span>
    <span class="k">let</span> <span class="nv">age</span><span class="p">:</span> <span class="kt">Int</span>
    <span class="k">let</span> <span class="nv">password</span><span class="p">:</span> <span class="kt">String</span>
<span class="p">}</span>
</code></pre></div></div>

<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 class="language-plaintext highlighter-rouge">Optional</code>, may loosen its strictness.</p>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">struct</span> <span class="kt">FormData</span> <span class="p">{</span>
    <span class="k">let</span> <span class="nv">name</span><span class="p">:</span> <span class="kt">String</span><span class="p">?</span>
    <span class="k">let</span> <span class="nv">age</span><span class="p">:</span> <span class="kt">Int</span><span class="p">?</span>
    <span class="k">let</span> <span class="nv">password</span><span class="p">:</span> <span class="kt">String</span><span class="p">?</span>
<span class="p">}</span>
</code></pre></div></div>

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

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">func</span> <span class="nf">firstStepFinished</span><span class="p">(</span><span class="n">with</span> <span class="nv">name</span><span class="p">:</span> <span class="kt">String</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kt">FormData</span> <span class="p">{</span>
    <span class="k">return</span> <span class="kt">FormData</span><span class="p">(</span><span class="nv">name</span><span class="p">:</span> <span class="n">name</span><span class="p">,</span> <span class="nv">age</span><span class="p">:</span> <span class="kc">nil</span><span class="p">,</span> <span class="nv">password</span><span class="p">:</span> <span class="kc">nil</span><span class="p">)</span>
<span class="p">}</span>

<span class="kd">func</span> <span class="nf">secondStepFinished</span><span class="p">(</span><span class="n">with</span> <span class="nv">age</span><span class="p">:</span> <span class="kt">Int</span><span class="p">,</span> <span class="nv">partialFormData</span><span class="p">:</span> <span class="kt">FormData</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kt">FormData</span> <span class="p">{</span>
    <span class="k">return</span> <span class="kt">FormData</span><span class="p">(</span><span class="nv">name</span><span class="p">:</span> <span class="n">partialFormData</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="nv">age</span><span class="p">:</span> <span class="n">age</span><span class="p">,</span> <span class="nv">password</span><span class="p">:</span> <span class="kc">nil</span><span class="p">)</span>
<span class="p">}</span>

<span class="kd">func</span> <span class="nf">thirdStepFinished</span><span class="p">(</span><span class="n">with</span> <span class="nv">password</span><span class="p">:</span> <span class="kt">String</span><span class="p">,</span> <span class="nv">partialFormData</span><span class="p">:</span> <span class="kt">FormData</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">let</span> <span class="nv">formData</span> <span class="o">=</span> <span class="kt">FormData</span><span class="p">(</span><span class="nv">name</span><span class="p">:</span> <span class="n">partialFormData</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="nv">age</span><span class="p">:</span> <span class="n">partialFormData</span><span class="o">.</span><span class="n">age</span><span class="p">,</span> <span class="nv">password</span><span class="p">:</span> <span class="n">password</span><span class="p">)</span>
    
    <span class="n">api</span><span class="o">.</span><span class="nf">performLogin</span><span class="p">(</span><span class="nv">with</span><span class="p">:</span> <span class="n">formData</span><span class="p">)</span>
<span class="p">}</span>
</code></pre></div></div>

<p>However, now we need to <code class="language-plaintext highlighter-rouge">guard</code> against any <code class="language-plaintext highlighter-rouge">nil</code> values if we want to use them (for example, to make a network request).</p>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">guard</span> <span class="k">let</span> <span class="nv">name</span> <span class="o">=</span> <span class="n">formData</span><span class="o">.</span><span class="n">name</span><span class="p">,</span>
      <span class="k">let</span> <span class="nv">age</span> <span class="o">=</span> <span class="n">formData</span><span class="o">.</span><span class="n">age</span><span class="p">,</span>
      <span class="k">let</span> <span class="nv">password</span> <span class="o">=</span> <span class="n">formData</span><span class="o">.</span><span class="n">password</span> <span class="p">{</span>
    <span class="k">return</span> <span class="c1">// what should we do here???</span>
<span class="p">}</span>

<span class="c1">// use data</span>
</code></pre></div></div>

<p>From a domain perspective, that <code class="language-plaintext highlighter-rouge">return</code> doesn’t make any sense.</p>

<p>One could argue that it’s “safe” 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>“we can raise an error to the user”</em> or <em>“we could track it and check if users are getting stuck somehow”</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 “lying” to us. That’s not loosen, it’s just flawed.</p>

<p>There are several approaches to make it better, like “one model per step”:</p>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">struct</span> <span class="kt">FirstStep</span> <span class="p">{</span>
    <span class="k">let</span> <span class="nv">name</span><span class="p">:</span> <span class="kt">String</span>
<span class="p">}</span>

<span class="kd">struct</span> <span class="kt">SecondStep</span> <span class="p">{</span>
    <span class="k">let</span> <span class="nv">name</span><span class="p">:</span> <span class="kt">String</span>
    <span class="k">let</span> <span class="nv">age</span><span class="p">:</span> <span class="kt">Int</span>
    
    <span class="nf">init</span><span class="p">(</span><span class="nv">firstStep</span><span class="p">:</span> <span class="kt">FirstStep</span><span class="p">,</span> <span class="nv">age</span><span class="p">:</span> <span class="kt">Int</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">self</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">firstStep</span><span class="o">.</span><span class="n">name</span>
        <span class="k">self</span><span class="o">.</span><span class="n">age</span> <span class="o">=</span> <span class="n">age</span>
    <span class="p">}</span>
<span class="p">}</span>

<span class="kd">struct</span> <span class="kt">ThirdStep</span> <span class="p">{</span>
    <span class="k">let</span> <span class="nv">name</span><span class="p">:</span> <span class="kt">String</span>
    <span class="k">let</span> <span class="nv">age</span><span class="p">:</span> <span class="kt">Int</span>
    <span class="k">let</span> <span class="nv">password</span><span class="p">:</span> <span class="kt">String</span>
    
    <span class="nf">init</span><span class="p">(</span><span class="nv">secondStep</span><span class="p">:</span> <span class="kt">SecondStep</span><span class="p">,</span> <span class="nv">password</span><span class="p">:</span> <span class="kt">String</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">self</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">secondStep</span><span class="o">.</span><span class="n">name</span>
        <span class="k">self</span><span class="o">.</span><span class="n">age</span> <span class="o">=</span> <span class="n">secondStep</span><span class="o">.</span><span class="n">age</span>
        <span class="k">self</span><span class="o">.</span><span class="n">password</span> <span class="o">=</span> <span class="n">password</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>That’s better! But there is also another way of doing things that doesn’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 class="language-plaintext highlighter-rouge">FormData</code> initializer, when interpreted as a function, has this shape:</p>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="kt">String</span><span class="p">,</span> <span class="kt">Int</span><span class="p">,</span> <span class="kt">String</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kt">FormData</span>
</code></pre></div></div>

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

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="kt">String</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="p">(</span><span class="kt">Int</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="p">(</span><span class="kt">String</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kt">FormData</span>
</code></pre></div></div>

<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>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">func</span> <span class="n">curry</span><span class="o">&lt;</span><span class="kt">A</span><span class="p">,</span> <span class="kt">B</span><span class="p">,</span> <span class="kt">C</span><span class="p">,</span> <span class="kt">D</span><span class="o">&gt;</span><span class="p">(</span>
    <span class="n">_</span> <span class="nv">f</span><span class="p">:</span> <span class="kd">@escaping</span> <span class="p">(</span><span class="kt">A</span><span class="p">,</span> <span class="kt">B</span><span class="p">,</span> <span class="kt">C</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kt">D</span>
<span class="p">)</span> <span class="o">-&gt;</span> <span class="p">(</span><span class="kt">A</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="p">(</span><span class="kt">B</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="p">(</span><span class="kt">C</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kt">D</span> <span class="p">{</span>
    <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="nf">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 class="p">}</span>
</code></pre></div></div>

<p>The function above goes from a function that takes multiple arguments <code class="language-plaintext highlighter-rouge">(A, B, C)</code> and produces a <code class="language-plaintext highlighter-rouge">D</code>, to single functions, that take one argument each: <code class="language-plaintext highlighter-rouge">(A) -&gt; (B) -&gt; (C)</code> and produces a <code class="language-plaintext highlighter-rouge">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>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">typealias</span> <span class="kt">Name</span> <span class="o">=</span> <span class="kt">String</span>
<span class="kd">typealias</span> <span class="kt">Age</span> <span class="o">=</span> <span class="kt">Int</span>
<span class="kd">typealias</span> <span class="kt">Password</span> <span class="o">=</span> <span class="kt">String</span>

<span class="kd">typealias</span> <span class="kt">FromFirstStep</span> <span class="o">=</span> <span class="p">(</span><span class="kt">Age</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="p">(</span><span class="kt">Password</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kt">FormData</span>
<span class="kd">typealias</span> <span class="kt">FromSecondStep</span> <span class="o">=</span> <span class="p">(</span><span class="kt">Password</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kt">FormData</span>

<span class="kd">func</span> <span class="nf">firstStepFinished</span><span class="p">(</span><span class="n">with</span> <span class="nv">name</span><span class="p">:</span> <span class="kt">String</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kt">FromFirstStep</span> <span class="p">{</span>
    <span class="k">let</span> <span class="nv">curried</span> <span class="o">=</span> <span class="nf">curry</span><span class="p">(</span><span class="kt">FormData</span><span class="o">.</span><span class="kd">init</span><span class="p">)</span> <span class="c1">// (Name) -&gt; (Age) -&gt; (Password) -&gt; FormData</span>
    <span class="k">return</span> <span class="nf">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 class="p">}</span>

<span class="kd">func</span> <span class="nf">secondStepFinished</span><span class="p">(</span><span class="n">with</span> <span class="nv">age</span><span class="p">:</span> <span class="kt">Int</span><span class="p">,</span> <span class="nv">partialData</span><span class="p">:</span> <span class="kt">FromFirstStep</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kt">FromSecondStep</span> <span class="p">{</span>
    <span class="k">return</span> <span class="nf">partialData</span><span class="p">(</span><span class="n">age</span><span class="p">)</span> <span class="c1">// (Password) -&gt; FormData</span>
<span class="p">}</span>

<span class="kd">func</span> <span class="nf">thirdStepFinished</span><span class="p">(</span><span class="n">with</span> <span class="nv">password</span><span class="p">:</span> <span class="kt">String</span><span class="p">,</span> <span class="nv">partialData</span><span class="p">:</span> <span class="kt">FromSecondStep</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">let</span> <span class="nv">formData</span> <span class="o">=</span> <span class="nf">partialData</span><span class="p">(</span><span class="n">password</span><span class="p">)</span>
    
    <span class="n">api</span><span class="o">.</span><span class="nf">performLogin</span><span class="p">(</span><span class="nv">with</span><span class="p">:</span> <span class="n">formData</span><span class="p">)</span>
<span class="p">}</span>
</code></pre></div></div>

<p>I’ve added a few <code class="language-plaintext highlighter-rouge">type aliases</code> just to make it more readable.
Cleaning up them further, we’ll have:</p>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">typealias</span> <span class="kt">FromThirdStep</span> <span class="o">=</span> <span class="kt">FormData</span> <span class="c1">// just to be explicit</span>
<span class="kd">typealias</span> <span class="kt">FromSecondStep</span> <span class="o">=</span> <span class="p">(</span><span class="kt">Password</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kt">FromThirdStep</span>
<span class="kd">typealias</span> <span class="kt">FromFirstStep</span> <span class="o">=</span> <span class="p">(</span><span class="kt">Age</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kt">FromSecondStep</span>
</code></pre></div></div>

<p>If you ask me, this is much better because we didn’t have to write anything else, other than the <code class="language-plaintext highlighter-rouge">curry</code><sup id="fnref:2"><a href="#fn:2" class="footnote" rel="footnote" role="doc-noteref">2</a></sup> function itself, which can be used in other places.</p>

<p>And that’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" role="doc-endnotes">
  <ol>
    <li id="fn:1">
      <p><code class="language-plaintext highlighter-rouge">functions take one argument and return one result.</code> From the book: <a href="http://haskellbook.com/"><code class="language-plaintext highlighter-rouge">Haskell Programming from First Principles</code></a> <a href="#fnref:1" class="reversefootnote" role="doc-backlink">&#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" class="reversefootnote" role="doc-backlink">&#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>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">struct</span> <span class="kt">Person</span><span class="p">:</span> <span class="kt">Codable</span> <span class="p">{</span>
    <span class="k">let</span> <span class="nv">name</span><span class="p">:</span> <span class="kt">String</span>
    <span class="k">let</span> <span class="nv">email</span><span class="p">:</span> <span class="kt">String</span>
    <span class="k">let</span> <span class="nv">age</span><span class="p">:</span> <span class="kt">Int</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Once the structure conforms to <code class="language-plaintext highlighter-rouge">Codable</code> everything works out of the box. There’s a nice way to test those structures and make sure that everything gets the exact JSON format that we aligned with backend.
<!--more--></p>

<p>Let’s create the following protocol in the test bundle:</p>
<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">protocol</span> <span class="kt">JSONTestable</span> <span class="p">{</span>
    <span class="nf">init</span><span class="p">?(</span><span class="n">_</span> <span class="nv">json</span><span class="p">:</span> <span class="kt">String</span><span class="p">)</span>
    <span class="kd">func</span> <span class="nf">json</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="kt">String</span><span class="p">?</span>
<span class="p">}</span>
</code></pre></div></div>

<p>After that we can immediately provide an extension which conforms to that protocol in the test bundle:</p>
<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">extension</span> <span class="kt">JSONTestable</span> <span class="k">where</span> <span class="k">Self</span><span class="p">:</span> <span class="kt">Codable</span> <span class="p">{</span>
    <span class="nf">init</span><span class="p">?(</span><span class="n">_</span> <span class="nv">json</span><span class="p">:</span> <span class="kt">String</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">guard</span>
            <span class="k">let</span> <span class="nv">data</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="nf">data</span><span class="p">(</span><span class="nv">using</span><span class="p">:</span> <span class="o">.</span><span class="n">utf8</span><span class="p">),</span>
            <span class="k">let</span> <span class="nv">decoded</span> <span class="o">=</span> <span class="k">try</span><span class="p">?</span> <span class="kt">JSONDecoder</span><span class="p">()</span><span class="o">.</span><span class="nf">decode</span><span class="p">(</span><span class="k">Self</span><span class="o">.</span><span class="k">self</span><span class="p">,</span> <span class="nv">from</span><span class="p">:</span> <span class="n">data</span><span class="p">)</span>
            <span class="k">else</span> <span class="p">{</span> <span class="k">return</span> <span class="kc">nil</span> <span class="p">}</span>
        <span class="k">self</span> <span class="o">=</span> <span class="n">decoded</span>
    <span class="p">}</span>

    <span class="kd">func</span> <span class="nf">json</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="kt">String</span><span class="p">?</span> <span class="p">{</span>
        <span class="k">guard</span> <span class="k">let</span> <span class="nv">data</span> <span class="o">=</span> <span class="k">try</span><span class="p">?</span> <span class="kt">JSONEncoder</span><span class="p">()</span><span class="o">.</span><span class="nf">encode</span><span class="p">(</span><span class="k">self</span><span class="p">)</span> <span class="k">else</span> <span class="p">{</span> <span class="k">return</span> <span class="kc">nil</span> <span class="p">}</span>
        <span class="k">return</span> <span class="kt">String</span><span class="p">(</span><span class="nv">data</span><span class="p">:</span> <span class="n">data</span><span class="p">,</span> <span class="nv">encoding</span><span class="p">:</span> <span class="o">.</span><span class="n">utf8</span><span class="p">)</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Then there’s only one simple step which needs to be done in the test bundle in order to test the structure:
<code class="language-plaintext highlighter-rouge">PersonTests.swift</code>:</p>
<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">extension</span> <span class="kt">Person</span><span class="p">:</span> <span class="kt">JSONTestable</span> <span class="p">{}</span>
</code></pre></div></div>

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

<p>Example tests:</p>
<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">final</span> <span class="kd">class</span> <span class="kt">PersonTests</span><span class="p">:</span> <span class="kt">XCTestCase</span> <span class="p">{</span>
    <span class="kd">func</span> <span class="nf">testJsonSerialization</span><span class="p">()</span> <span class="p">{</span>
        <span class="k">let</span> <span class="nv">person</span> <span class="o">=</span> <span class="kt">Person</span><span class="p">(</span><span class="nv">name</span><span class="p">:</span> <span class="s">"John Appleased"</span><span class="p">,</span> <span class="nv">email</span><span class="p">:</span> <span class="s">"john@appleased.com"</span><span class="p">,</span> <span class="nv">age</span><span class="p">:</span> <span class="mi">30</span><span class="p">)</span>
        <span class="kt">XCTAssertEqual</span><span class="p">(</span><span class="n">personJson</span><span class="p">,</span> <span class="n">person</span><span class="o">.</span><span class="nf">json</span><span class="p">())</span> <span class="c1">// ✅</span>
    <span class="p">}</span>
    
    <span class="kd">func</span> <span class="nf">testJsonDeserialization</span><span class="p">()</span> <span class="p">{</span>
        <span class="k">let</span> <span class="nv">person</span> <span class="o">=</span> <span class="kt">Person</span><span class="p">(</span><span class="nv">name</span><span class="p">:</span> <span class="s">"John Appleased"</span><span class="p">,</span> <span class="nv">email</span><span class="p">:</span> <span class="s">"john@appleased.com"</span><span class="p">,</span> <span class="nv">age</span><span class="p">:</span> <span class="mi">30</span><span class="p">)</span>
        <span class="kt">XCTAssertEqual</span><span class="p">(</span><span class="n">person</span><span class="p">,</span> <span class="kt">Person</span><span class="p">(</span><span class="n">personJson</span><span class="p">))</span> <span class="c1">// ✅</span>
    <span class="p">}</span>
<span class="p">}</span>

<span class="kd">private</span> <span class="k">let</span> <span class="nv">personJson</span> <span class="o">=</span> <span class="s">"""
{"</span><span class="n">name</span><span class="s">":"</span><span class="kt">John</span> <span class="kt">Appleased</span><span class="s">","</span><span class="n">email</span><span class="s">":"</span><span class="n">john</span><span class="kd">@appleased</span><span class="o">.</span><span class="n">com</span><span class="s">","</span><span class="n">age</span><span class="s">":30}
"""</span>

<span class="kd">extension</span> <span class="kt">Person</span><span class="p">:</span> <span class="kt">JSONTestable</span><span class="p">,</span> <span class="kt">Equatable</span> <span class="p">{}</span>
</code></pre></div></div>

<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 “real world”. <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 class="language-plaintext highlighter-rouge">UserDefaults</code>), but there are instances where this is not enough. That’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 class="language-plaintext highlighter-rouge">AVFoundation</code></a>.</p>

<!--more-->

<p>Although you can use <code class="language-plaintext highlighter-rouge">protocols</code> to generalize the real objects, at some point, you are going to stumble upon a dilemma: the simulator doesn’t have a camera, and you can’t instantiate the framework classes making the tests (almost) impossible.</p>

<h4 id="what-are-you-talking-about">What are you talking about?</h4>

<p>Let’s start with a very simple program that captures QR Code (I’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>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">enum</span> <span class="kt">CameraError</span><span class="p">:</span> <span class="kt">Error</span> <span class="p">{</span>
    <span class="k">case</span> <span class="n">invalidMetadata</span>
<span class="p">}</span>

<span class="kd">protocol</span> <span class="kt">CameraOutputDelegate</span><span class="p">:</span> <span class="kd">class</span> <span class="p">{</span>
    <span class="kd">func</span> <span class="nf">qrCode</span><span class="p">(</span><span class="n">read</span> <span class="nv">code</span><span class="p">:</span> <span class="kt">String</span><span class="p">)</span>
    <span class="kd">func</span> <span class="nf">qrCode</span><span class="p">(</span><span class="n">failed</span> <span class="nv">error</span><span class="p">:</span> <span class="kt">CameraError</span><span class="p">)</span>
<span class="p">}</span>

<span class="kd">final</span> <span class="kd">class</span> <span class="kt">Camera</span><span class="p">:</span> <span class="kt">NSObject</span> <span class="p">{</span>
    <span class="kd">private</span> <span class="k">let</span> <span class="nv">session</span><span class="p">:</span> <span class="kt">AVCaptureSession</span>
    <span class="kd">private</span> <span class="k">let</span> <span class="nv">metadataOutput</span><span class="p">:</span> <span class="kt">AVCaptureMetadataOutput</span>
    <span class="kd">private</span> <span class="k">weak</span> <span class="k">var</span> <span class="nv">delegate</span><span class="p">:</span> <span class="kt">CameraOutputDelegate</span><span class="p">?</span>

    <span class="kd">public</span> <span class="nf">init</span><span class="p">(</span>
        <span class="nv">session</span><span class="p">:</span> <span class="kt">AVCaptureSession</span> <span class="o">=</span> <span class="kt">AVCaptureSession</span><span class="p">(),</span>
        <span class="nv">metadataOutput</span><span class="p">:</span> <span class="kt">AVCaptureMetadataOutput</span> <span class="o">=</span> <span class="kt">AVCaptureMetadataOutput</span><span class="p">(),</span>
        <span class="nv">delegate</span><span class="p">:</span> <span class="kt">CameraOutputDelegate</span><span class="p">?</span>
    <span class="p">)</span> <span class="p">{</span>
        <span class="k">self</span><span class="o">.</span><span class="n">session</span> <span class="o">=</span> <span class="n">session</span>
        <span class="k">self</span><span class="o">.</span><span class="n">metadataOutput</span> <span class="o">=</span> <span class="n">metadataOutput</span>

        <span class="k">super</span><span class="o">.</span><span class="nf">init</span><span class="p">()</span>

        <span class="k">self</span><span class="o">.</span><span class="n">metadataOutput</span><span class="o">.</span><span class="nf">setMetadataObjectsDelegate</span><span class="p">(</span><span class="k">self</span><span class="p">,</span> <span class="nv">queue</span><span class="p">:</span> <span class="o">.</span><span class="n">main</span><span class="p">)</span>
    <span class="p">}</span>
<span class="p">}</span>

<span class="kd">extension</span> <span class="kt">Camera</span><span class="p">:</span> <span class="kt">AVCaptureMetadataOutputObjectsDelegate</span> <span class="p">{</span>
    <span class="kd">public</span> <span class="kd">func</span> <span class="nf">metadataOutput</span><span class="p">(</span>
        <span class="n">_</span> <span class="nv">output</span><span class="p">:</span> <span class="kt">AVCaptureMetadataOutput</span><span class="p">,</span>
        <span class="n">didOutput</span> <span class="nv">metadataObjects</span><span class="p">:</span> <span class="p">[</span><span class="kt">AVMetadataObject</span><span class="p">],</span>
        <span class="n">from</span> <span class="nv">connection</span><span class="p">:</span> <span class="kt">AVCaptureConnection</span>
    <span class="p">)</span> <span class="p">{</span>
        <span class="k">guard</span> <span class="k">let</span> <span class="nv">object</span> <span class="o">=</span> <span class="n">metadataObjects</span><span class="o">.</span><span class="n">first</span> <span class="k">as?</span> <span class="kt">AVMetadataMachineReadableCodeObject</span><span class="p">,</span>
              <span class="k">let</span> <span class="nv">code</span> <span class="o">=</span> <span class="n">object</span><span class="o">.</span><span class="n">stringValue</span><span class="p">,</span> <span class="n">object</span><span class="o">.</span><span class="n">type</span> <span class="o">==</span> <span class="o">.</span><span class="n">qr</span> <span class="k">else</span> <span class="p">{</span>
                <span class="n">delegate</span><span class="p">?</span><span class="o">.</span><span class="nf">qrCode</span><span class="p">(</span><span class="nv">failed</span><span class="p">:</span> <span class="o">.</span><span class="n">invalidMetadata</span><span class="p">)</span>
                <span class="k">return</span>
        <span class="p">}</span>

        <span class="n">delegate</span><span class="p">?</span><span class="o">.</span><span class="nf">qrCode</span><span class="p">(</span><span class="nv">read</span><span class="p">:</span> <span class="n">code</span><span class="p">)</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<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 class="language-plaintext highlighter-rouge">AVCaptureMetadataOutputObjectsDelegate</code></a>. Say we want to exercise our program in a way that we ensure that the <code class="language-plaintext highlighter-rouge">CameraOutputDelegate</code> methods are properly called, given what <code class="language-plaintext highlighter-rouge">AVFoundation</code> provides.</p>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">final</span> <span class="kd">class</span> <span class="kt">CameraOutputSpy</span><span class="p">:</span> <span class="kt">CameraOutputDelegate</span> <span class="p">{</span>
    <span class="k">var</span> <span class="nv">qrCodeReadCalled</span><span class="p">:</span> <span class="kt">Bool</span><span class="p">?</span>
    <span class="k">var</span> <span class="nv">qrCodePassed</span><span class="p">:</span> <span class="kt">String</span><span class="p">?</span>
    <span class="k">var</span> <span class="nv">qrCodeFailedCalled</span><span class="p">:</span> <span class="kt">Bool</span><span class="p">?</span>
    <span class="k">var</span> <span class="nv">qrCodeErrorPassed</span><span class="p">:</span> <span class="kt">CameraError</span><span class="p">?</span>

    <span class="kd">func</span> <span class="nf">qrCode</span><span class="p">(</span><span class="n">read</span> <span class="nv">code</span><span class="p">:</span> <span class="kt">String</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">qrCodeReadCalled</span> <span class="o">=</span> <span class="kc">true</span>
        <span class="n">qrCodePassed</span> <span class="o">=</span> <span class="n">code</span>
    <span class="p">}</span>
    <span class="kd">func</span> <span class="nf">qrCode</span><span class="p">(</span><span class="n">failed</span> <span class="nv">error</span><span class="p">:</span> <span class="kt">CameraError</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">qrCodeFailedCalled</span> <span class="o">=</span> <span class="kc">true</span>
        <span class="n">qrCodeErrorPassed</span> <span class="o">=</span> <span class="n">error</span>
    <span class="p">}</span>
<span class="p">}</span>

<span class="k">let</span> <span class="nv">delegate</span> <span class="o">=</span> <span class="kt">CameraOutputSpy</span><span class="p">()</span>

<span class="k">let</span> <span class="nv">camera</span> <span class="o">=</span> <span class="kt">Camera</span><span class="p">(</span>
    <span class="nv">session</span><span class="p">:</span> <span class="kt">AVCaptureSession</span><span class="p">(),</span>
    <span class="nv">metadataOutput</span><span class="p">:</span> <span class="kt">AVCaptureMetadataOutput</span><span class="p">(),</span>
    <span class="nv">delegate</span><span class="p">:</span> <span class="n">delegate</span>
<span class="p">)</span>

<span class="n">camera</span><span class="o">.</span><span class="nf">metadataOutput</span><span class="p">(</span>
    <span class="kt">AVCaptureMetadataOutput</span><span class="p">(),</span>
    <span class="nv">didOutput</span><span class="p">:</span> <span class="p">[</span><span class="kt">AVMetadataMachineReadableCodeObject</span><span class="p">()],</span> <span class="c1">// error: 'init()' is unavailable</span>
    <span class="nv">from</span><span class="p">:</span> <span class="kt">AVCaptureConnection</span><span class="p">()</span> <span class="c1">//error: 'init()' is unavailable</span>
<span class="p">)</span>
</code></pre></div></div>

<p>Waat!?</p>

<p>The problem here is that all of these classes are concrete, so we can’t abstract them into an interface. Also they are supposed to be created and populated at runtime, hence you can’t <code class="language-plaintext highlighter-rouge">init</code> them.</p>

<h4 id="-swizzle-to-the-rescue">🍸 <code class="language-plaintext highlighter-rouge">Swizzle</code> to the rescue</h4>

<p>One possible solution for this kind of scenario (since the framework it’s all <code class="language-plaintext highlighter-rouge">Objective-C</code>…for now at least), is to use the <a href="https://nshipster.com/method-swizzling/"><code class="language-plaintext highlighter-rouge">Objective-C</code> runtime shenanigans</a> to “fill this gap”.</p>

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

<p>I’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 class="language-plaintext highlighter-rouge">NSObject.init</code> and exchange it with some new fake <code class="language-plaintext highlighter-rouge">init</code> we are going to create.</p>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">struct</span> <span class="kt">Swizzler</span> <span class="p">{</span>
    <span class="kd">private</span> <span class="k">let</span> <span class="nv">klass</span><span class="p">:</span> <span class="kt">AnyClass</span>

    <span class="nf">init</span><span class="p">(</span><span class="n">_</span> <span class="nv">klass</span><span class="p">:</span> <span class="kt">AnyClass</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">self</span><span class="o">.</span><span class="n">klass</span> <span class="o">=</span> <span class="n">klass</span>
    <span class="p">}</span>

    <span class="kd">func</span> <span class="nf">injectNSObjectInit</span><span class="p">(</span><span class="n">into</span> <span class="nv">selector</span><span class="p">:</span> <span class="kt">Selector</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">let</span> <span class="nv">original</span> <span class="o">=</span> <span class="p">[</span>
            <span class="nf">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 class="p">]</span><span class="o">.</span><span class="n">compactMap</span> <span class="p">{</span> <span class="nv">$0</span> <span class="p">}</span>

        <span class="k">let</span> <span class="nv">swizzled</span> <span class="o">=</span> <span class="p">[</span>
            <span class="nf">class_getInstanceMethod</span><span class="p">(</span><span class="n">klass</span><span class="p">,</span> <span class="k">#selector</span><span class="p">(</span><span class="kt">NSObject</span><span class="o">.</span><span class="kd">init</span><span class="p">))</span>
        <span class="p">]</span><span class="o">.</span><span class="n">compactMap</span> <span class="p">{</span> <span class="nv">$0</span> <span class="p">}</span>

        <span class="nf">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 class="o">.</span><span class="n">forEach</span> <span class="p">{</span>
                <span class="nf">method_setImplementation</span><span class="p">(</span><span class="nv">$0</span><span class="o">.</span><span class="mi">0</span><span class="p">,</span> <span class="nf">method_getImplementation</span><span class="p">(</span><span class="nv">$0</span><span class="o">.</span><span class="mi">1</span><span class="p">))</span>
        <span class="p">}</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

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

<ol>
  <li>Create a <code class="language-plaintext highlighter-rouge">private init</code> that will hold the implemetation of <code class="language-plaintext highlighter-rouge">NSObject.init</code>.</li>
  <li>Create our “designated initializer”, capturing the parameters our test needs.</li>
  <li>Do the swizzle dance.</li>
</ol>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">final</span> <span class="kd">class</span> <span class="kt">FakeMachineReadableCodeObject</span><span class="p">:</span> <span class="kt">AVMetadataMachineReadableCodeObject</span> <span class="p">{</span>
    <span class="k">var</span> <span class="nv">code</span><span class="p">:</span> <span class="kt">String</span><span class="p">?</span>
    <span class="k">var</span> <span class="nv">dataType</span><span class="p">:</span> <span class="kt">AVMetadataObject</span><span class="o">.</span><span class="kt">ObjectType</span> <span class="o">=</span> <span class="o">.</span><span class="n">qr</span>

    <span class="k">override</span> <span class="k">var</span> <span class="nv">stringValue</span><span class="p">:</span> <span class="kt">String</span><span class="p">?</span> <span class="p">{</span>
        <span class="k">return</span> <span class="n">code</span>
    <span class="p">}</span>

    <span class="k">override</span> <span class="k">var</span> <span class="nv">type</span><span class="p">:</span> <span class="kt">AVMetadataObject</span><span class="o">.</span><span class="kt">ObjectType</span> <span class="p">{</span>
        <span class="k">return</span> <span class="n">dataType</span>
    <span class="p">}</span>

    <span class="c1">// 1</span>
    <span class="kd">@objc</span> <span class="kd">private</span> <span class="kd">convenience</span> <span class="nf">init</span><span class="p">(</span><span class="nv">fake</span><span class="p">:</span> <span class="kt">String</span><span class="p">)</span> <span class="p">{</span> <span class="nf">fatalError</span><span class="p">()</span> <span class="p">}</span>

    <span class="kd">private</span> <span class="kd">class</span> <span class="kd">func</span> <span class="nf">fake</span><span class="p">(</span><span class="nv">fake</span><span class="p">:</span> <span class="kt">String</span><span class="p">,</span> <span class="nv">type</span><span class="p">:</span> <span class="kt">AVMetadataObject</span><span class="o">.</span><span class="kt">ObjectType</span> <span class="o">=</span> <span class="o">.</span><span class="n">qr</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kt">FakeMachineReadableCodeObject</span><span class="p">?</span> <span class="p">{</span>
        <span class="k">let</span> <span class="nv">m</span> <span class="o">=</span> <span class="kt">FakeMachineReadableCodeObject</span><span class="p">(</span><span class="nv">fake</span><span class="p">:</span> <span class="n">fake</span><span class="p">)</span>
        <span class="n">m</span><span class="o">.</span><span class="n">code</span> <span class="o">=</span> <span class="n">fake</span>
        <span class="n">m</span><span class="o">.</span><span class="n">dataType</span> <span class="o">=</span> <span class="n">type</span>

        <span class="k">return</span> <span class="n">m</span>
    <span class="p">}</span>

    <span class="c1">// 2</span>
    <span class="kd">static</span> <span class="kd">func</span> <span class="nf">createFake</span><span class="p">(</span><span class="nv">code</span><span class="p">:</span> <span class="kt">String</span><span class="p">,</span> <span class="nv">type</span><span class="p">:</span> <span class="kt">AVMetadataObject</span><span class="o">.</span><span class="kt">ObjectType</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kt">FakeMachineReadableCodeObject</span><span class="p">?</span> <span class="p">{</span>
        <span class="c1">// 3</span>
        <span class="kt">Swizzler</span><span class="p">(</span><span class="k">self</span><span class="p">)</span><span class="o">.</span><span class="nf">injectNSObjectInit</span><span class="p">(</span><span class="nv">into</span><span class="p">:</span> <span class="k">#selector</span><span class="p">(</span><span class="kt">FakeMachineReadableCodeObject</span><span class="o">.</span><span class="nf">init</span><span class="p">(</span><span class="nv">fake</span><span class="p">:)))</span>
        <span class="k">return</span> <span class="nf">fake</span><span class="p">(</span><span class="nv">fake</span><span class="p">:</span> <span class="n">code</span><span class="p">,</span> <span class="nv">type</span><span class="p">:</span> <span class="n">type</span><span class="p">)</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Now, we can create a fake QR code payload in our tests and check if your implementation of <code class="language-plaintext highlighter-rouge">AVCaptureMetadataOutputObjectsDelegate</code> does what you expect it to.</p>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">let</span> <span class="nv">delegate</span> <span class="o">=</span> <span class="kt">CameraOutputSpy</span><span class="p">()</span>

<span class="k">let</span> <span class="nv">camera</span> <span class="o">=</span> <span class="kt">Camera</span><span class="p">(</span>
    <span class="nv">session</span><span class="p">:</span> <span class="kt">AVCaptureSession</span><span class="p">(),</span>
    <span class="nv">metadataOutput</span><span class="p">:</span> <span class="kt">AVCaptureMetadataOutput</span><span class="p">(),</span>
    <span class="nv">delegate</span><span class="p">:</span> <span class="n">delegate</span>
<span class="p">)</span>

<span class="n">camera</span><span class="o">.</span><span class="nf">metadataOutput</span><span class="p">(</span>
    <span class="kt">QRMetadataOutputFake</span><span class="p">(),</span> <span class="c1">// plain ol' subclass, not really important</span>
    <span class="nv">didOutput</span><span class="p">:</span> <span class="p">[</span>
        <span class="kt">FakeMachineReadableCodeObject</span><span class="o">.</span><span class="nf">createFake</span><span class="p">(</span><span class="nv">code</span><span class="p">:</span> <span class="s">"interleaved2of5 value"</span><span class="p">,</span> <span class="nv">type</span><span class="p">:</span> <span class="o">.</span> <span class="n">interleaved2of5</span><span class="p">)</span><span class="o">!</span>
        <span class="kt">FakeMachineReadableCodeObject</span><span class="o">.</span><span class="nf">createFake</span><span class="p">(</span><span class="nv">code</span><span class="p">:</span> <span class="s">"QR code value"</span><span class="p">,</span> <span class="nv">type</span><span class="p">:</span> <span class="o">.</span><span class="n">qr</span><span class="p">)</span><span class="o">!</span>
    <span class="p">],</span>
    <span class="nv">from</span><span class="p">:</span> <span class="kt">AVCaptureConnection</span><span class="p">(</span>
        <span class="nv">inputPorts</span><span class="p">:</span> <span class="p">[],</span>
        <span class="nv">output</span><span class="p">:</span> <span class="kt">AVCaptureOutput</span><span class="o">.</span><span class="n">createFake</span><span class="o">!</span> <span class="c1">// Another swizzle</span>
  <span class="p">)</span>
<span class="p">)</span>

<span class="kt">XCTAssertEqual</span><span class="p">(</span><span class="n">delegate</span><span class="o">.</span><span class="n">qrCodeReadCalled</span><span class="p">,</span> <span class="kc">true</span><span class="p">)</span>
<span class="kt">XCTAssertEqual</span><span class="p">(</span><span class="n">delegate</span><span class="o">.</span><span class="n">qrCodePassed</span><span class="p">,</span> <span class="s">"QR code value"</span><span class="p">)</span>
<span class="kt">XCTAssertNil</span><span class="p">(</span><span class="n">delegate</span><span class="o">.</span><span class="n">qrCodeFailedCalled</span><span class="p">)</span>
<span class="kt">XCTAssertNil</span><span class="p">(</span><span class="n">delegate</span><span class="o">.</span><span class="n">qrCodeErrorPassed</span><span class="p">)</span>

</code></pre></div></div>

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

<p>You can use this technique along side with other collaborators, like <code class="language-plaintext highlighter-rouge">AVCaptureDevice</code>, <code class="language-plaintext highlighter-rouge">AVCaptureInput</code> and <code class="language-plaintext highlighter-rouge">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 class="language-plaintext highlighter-rouge">UIAlertView</code> in iOS.</p>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">let</span> <span class="nv">alert</span> <span class="o">=</span> <span class="kt">UIAlertView</span><span class="p">(</span><span class="nv">title</span><span class="p">:</span> <span class="s">"Question"</span><span class="p">,</span> <span class="nv">message</span><span class="p">:</span> <span class="s">"Do you like apples?"</span><span class="p">,</span> <span class="nv">delegate</span><span class="p">:</span> <span class="k">self</span><span class="p">,</span> <span class="nv">cancelButtonTitle</span><span class="p">:</span> <span class="s">"I hate it!"</span><span class="p">,</span> <span class="nv">otherButtonTitles</span><span class="p">:</span> <span class="s">"Yes, I do!"</span><span class="p">,</span> <span class="s">"More of less"</span><span class="p">)</span>
</code></pre></div></div>

<p>This is a long method call, right? But really, that’s not the problem. The problem here is that our class has to conform to <code class="language-plaintext highlighter-rouge">UIAlertViewDelegate</code> in order to receive the alert result. Wouldn’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 class="language-plaintext highlighter-rouge">UIAlertView</code> class is as above:</p>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">class</span> <span class="kt">AlertBuilder</span><span class="p">:</span> <span class="kt">NSObject</span><span class="p">,</span> <span class="kt">UIAlertViewDelegate</span> <span class="p">{</span>

    <span class="kd">typealias</span> <span class="kt">AlertBuilderCompletion</span> <span class="o">=</span> <span class="kt">Int</span> <span class="o">-&gt;</span> <span class="kt">Void</span>

    <span class="kd">private</span> <span class="k">var</span> <span class="nv">alertTitle</span><span class="p">:</span> <span class="kt">String</span> <span class="o">=</span> <span class="s">""</span>
    <span class="kd">private</span> <span class="k">var</span> <span class="nv">alertMessage</span><span class="p">:</span> <span class="kt">String</span> <span class="o">=</span> <span class="s">""</span>
    <span class="kd">private</span> <span class="k">var</span> <span class="nv">alertStyle</span><span class="p">:</span> <span class="kt">UIAlertViewStyle</span> <span class="o">=</span> <span class="o">.</span><span class="kt">Default</span>
    <span class="kd">private</span> <span class="k">var</span> <span class="nv">alertButtonTitles</span><span class="p">:</span> <span class="p">[</span><span class="kt">String</span><span class="p">]</span> <span class="o">=</span> <span class="p">[]</span>
    <span class="kd">private</span> <span class="k">var</span> <span class="nv">alertCompletion</span><span class="p">:</span> <span class="kt">AlertBuilderCompletion</span><span class="p">?</span> <span class="o">=</span> <span class="kc">nil</span>

    <span class="kd">func</span> <span class="nf">title</span><span class="p">(</span><span class="nv">title</span><span class="p">:</span> <span class="kt">String</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kt">AlertBuilder</span> <span class="p">{</span>
        <span class="n">alertTitle</span> <span class="o">=</span> <span class="n">title</span>
        <span class="k">return</span> <span class="k">self</span>
    <span class="p">}</span>

    <span class="kd">func</span> <span class="nf">message</span><span class="p">(</span><span class="nv">message</span><span class="p">:</span> <span class="kt">String</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kt">AlertBuilder</span> <span class="p">{</span>
        <span class="n">alertMessage</span> <span class="o">=</span> <span class="n">message</span>
        <span class="k">return</span> <span class="k">self</span>
    <span class="p">}</span>

    <span class="kd">func</span> <span class="nf">style</span><span class="p">(</span><span class="nv">style</span><span class="p">:</span> <span class="kt">UIAlertViewStyle</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kt">AlertBuilder</span> <span class="p">{</span>
        <span class="n">alertStyle</span> <span class="o">=</span> <span class="n">style</span>
        <span class="k">return</span> <span class="k">self</span>
    <span class="p">}</span>

    <span class="kd">func</span> <span class="nf">buttonTitles</span><span class="p">(</span><span class="nv">titles</span><span class="p">:</span> <span class="kt">String</span><span class="o">...</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kt">AlertBuilder</span> <span class="p">{</span>
        <span class="n">alertButtonTitles</span> <span class="o">=</span> <span class="n">alertButtonTitles</span> <span class="o">+</span> <span class="n">titles</span>
        <span class="k">return</span> <span class="k">self</span>
    <span class="p">}</span>

    <span class="kd">func</span> <span class="nf">show</span><span class="p">(</span><span class="nv">completion</span><span class="p">:</span> <span class="kt">AlertBuilderCompletion</span><span class="p">?</span> <span class="o">=</span> <span class="kc">nil</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">let</span> <span class="nv">alertView</span> <span class="o">=</span> <span class="kt">UIAlertView</span><span class="p">()</span>
        <span class="n">alertView</span><span class="o">.</span><span class="n">delegate</span> <span class="o">=</span> <span class="k">self</span>
        <span class="n">alertView</span><span class="o">.</span><span class="n">title</span> <span class="o">=</span> <span class="n">alertTitle</span>
        <span class="n">alertView</span><span class="o">.</span><span class="n">message</span> <span class="o">=</span> <span class="n">alertMessage</span>
        <span class="n">alertView</span><span class="o">.</span><span class="n">alertViewStyle</span> <span class="o">=</span> <span class="n">alertStyle</span>

        <span class="n">alertButtonTitles</span><span class="o">.</span><span class="n">forEach</span> <span class="p">{</span> <span class="n">title</span> <span class="k">in</span>
            <span class="n">alertView</span><span class="o">.</span><span class="nf">addButtonWithTitle</span><span class="p">(</span><span class="n">title</span><span class="p">)</span>
        <span class="p">}</span>

        <span class="n">alertCompletion</span> <span class="o">=</span> <span class="n">completion</span>
        <span class="n">alertView</span><span class="o">.</span><span class="nf">show</span><span class="p">()</span>
    <span class="p">}</span>

    <span class="kd">func</span> <span class="nf">alertView</span><span class="p">(</span><span class="nv">alertView</span><span class="p">:</span> <span class="kt">UIAlertView</span><span class="p">,</span> <span class="n">didDismissWithButtonIndex</span> <span class="nv">buttonIndex</span><span class="p">:</span> <span class="kt">Int</span><span class="p">)</span> <span class="p">{</span>
        <span class="nf">alertCompletion</span><span class="p">?(</span><span class="n">buttonIndex</span><span class="p">)</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

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

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    alert.title("Question")
    .message("Do you like apples?")
    .buttonTitles("Yes, I do!","More of less", "I hate it!")
    .show { index in
        print(index)
    }
</code></pre></div></div>

<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’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 class="language-plaintext highlighter-rouge">NSAttributedString</code> or <code class="language-plaintext highlighter-rouge">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 class="language-plaintext highlighter-rouge">UIAlertController</code> and deprecated both <code class="language-plaintext highlighter-rouge">UIAlertView</code> and <code class="language-plaintext highlighter-rouge">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 class="language-plaintext highlighter-rouge">@noescape</code> attribute. It’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 class="language-plaintext highlighter-rouge">@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 class="language-plaintext highlighter-rouge">self.</code> requirement in closure arguments.
<!--more-->
Lets analyze those smart statements and put it into code so everyone can enjoy it:</p>
</blockquote>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">func</span> <span class="nf">foo</span><span class="p">(</span><span class="kd">@noescape</span> <span class="nv">code</span><span class="p">:(()</span> <span class="o">-&gt;</span> <span class="kt">String</span><span class="p">))</span> <span class="o">-&gt;</span> <span class="kt">String</span>
<span class="p">{</span>
    <span class="k">return</span> <span class="s">"foo </span><span class="se">\(</span><span class="nf">bar</span><span class="p">(</span><span class="n">code</span><span class="p">)</span><span class="se">)</span><span class="s">"</span>
<span class="p">}</span>

<span class="kd">func</span> <span class="nf">bar</span><span class="p">(</span><span class="kd">@noescape</span> <span class="nv">code</span><span class="p">:(()</span> <span class="o">-&gt;</span> <span class="kt">String</span><span class="p">))</span> <span class="o">-&gt;</span> <span class="kt">String</span>
<span class="p">{</span>
    <span class="k">return</span> <span class="nf">code</span><span class="p">()</span> 
<span class="p">}</span>

<span class="nf">print</span><span class="p">(</span><span class="nf">foo</span><span class="p">()</span> <span class="p">{</span><span class="s">"bar"</span><span class="p">})</span>
</code></pre></div></div>

<p>It can be also captured in another <code class="language-plaintext highlighter-rouge">@noescape</code> closure:</p>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">func</span> <span class="nf">baz</span><span class="p">(</span><span class="kd">@noescape</span> <span class="nv">code</span><span class="p">:(()</span> <span class="o">-&gt;</span> <span class="kt">String</span><span class="p">))</span>
<span class="p">{</span>
    <span class="n">qux</span> <span class="p">{</span>
        <span class="nf">code</span><span class="p">()</span>
    <span class="p">}</span>
<span class="p">}</span>
<span class="kd">func</span> <span class="nf">qux</span><span class="p">(</span><span class="kd">@noescape</span> <span class="nv">code</span><span class="p">:(()</span> <span class="o">-&gt;</span> <span class="kt">String</span><span class="p">))</span> <span class="p">{}</span>
</code></pre></div></div>

<p>It’s important to point out, that closures (and functions) annotated with <code class="language-plaintext highlighter-rouge">@noescape</code> can only be passed as <code class="language-plaintext highlighter-rouge">@noescape</code> parameters. What this mean is:</p>

<ul>
  <li>we cannot run it asynchronously:
<img class="center" src="/images/noescape-attribute/noescape-async.png" /></li>
  <li>we can’t store it
<img class="center" src="/images/noescape-attribute/noescape-store.png" /></li>
  <li>we can’t capture it in another non-<code class="language-plaintext highlighter-rouge">@noescape</code> closure
<img class="center" src="/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>
  <div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">func</span> <span class="nf">autoreleasepool</span><span class="p">(</span><span class="kd">@noescape</span> <span class="nv">code</span><span class="p">:</span> <span class="p">()</span> <span class="o">-&gt;</span> <span class="p">())</span> <span class="p">{</span>
    <span class="nf">pushAutoreleasePool</span><span class="p">()</span>
    <span class="nf">code</span><span class="p">()</span>
    <span class="nf">popAutoreleasePool</span><span class="p">()</span>
<span class="p">}</span>
</code></pre></div>  </div>
  <p>So dear developer the best is yet to come! ;]</p>
</blockquote>
]]></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:
<!--more-->
This code:</p>

<pre><code class="language-C">void InitializeAudioSource(void *userAudioClass);
void PlayAudio();
void SetAudioGain(Float32 gain);
</code></pre>

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

<pre><code class="language-Swift">Void InitializeAudioSource(userAudioClass: UnsafeMutablePointer&lt;Void&gt;)
Void PlayAudio(Void)
Void SetAudioGain(gain:Float32)
</code></pre>

<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>

<pre><code class="language-Swift">class KWSBackgroundStreamPlayer: NSObject {
    
    func setGain(gain : Float32) {
        
        SetAudioGain(gain)
    }
    
    func play() {
    
        PlayAudio()
    }
    
    func pause() {
    
        PauseAudio()
    }

    func close() {
    
        if self.trackClosed == true {
        
            return
        }
        
        self.trackClosed = true
       
        CloseAudio()
    }
    
    deinit {
        
        self.close()
    }
    
}

</code></pre>

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

<pre><code class="language-Swift">InitializeAudioSource( &amp;self )
</code></pre>

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

<p><img class="center" src="/images/cfunction_pointers/error_cfunction.png" /></p>

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

<pre><code class="language-Swift">//convert self to unmanaged object
let anUnmanaged = Unmanaged&lt;KWSBackgroundStreamPlayer&gt;.passUnretained(self)
//get raw data pointer
let opaque: COpaquePointer = anUnmanaged.toOpaque()
//convert to Mutable to match Swift safe type check
let voidSelf = UnsafeMutablePointer&lt;Void&gt;(opaque)
            
InitializeAudioSource( voidSelf )
</code></pre>
<p>And that’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 class="language-plaintext highlighter-rouge">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 class="language-plaintext highlighter-rouge">toOpaque()</code> comes in. This will return an raw C pointer of our class object. This is the true <code class="language-plaintext highlighter-rouge">void *</code> pointer. 
<code class="language-plaintext highlighter-rouge">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 class="language-plaintext highlighter-rouge">UnsafeMutablePointer</code> with <code class="language-plaintext highlighter-rouge">&lt;Void&gt;</code> class type. Every UnsafePointer have constructor that takes <code class="language-plaintext highlighter-rouge">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’s easy to convert void pointer to proper class type, you just need to use <code class="language-plaintext highlighter-rouge">bridge</code> to do so:</p>

<pre><code class="language-C">void InitializeAudioSource(void *userAudioClass)
{
	//bridge it back to our class 
    KWSBackgroundStreamPlayer *backgroundPlayer = (__bridge KWSBackgroundStreamPlayer*)userAudioClass;

    //get some properties
    NSString *path = backgroundPlayer.filePath;
    repeatSong = backgroundPlayer.repeatSong;
      
    //...    
   
    //we can even pass it as parameter with proper pointer type
    OSStatus result = AudioQueueNewOutput(&amp;dataFormat, BufferCallback, (__bridge void *)(backgroundPlayer), nil, nil, 0, &amp;queue);
   
    //... 
}
</code></pre>

<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 class="language-plaintext highlighter-rouge">Unmanaged</code> and <code class="language-plaintext highlighter-rouge">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: “With Great Power Comes Great Responsibility” ;)</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… But here I want to show you my small proof of concept of working bluetooth low enery multiplayer game.
<!--more-->
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’s focus on basics:</p>

<p>Pros:</p>

<ol>
  <li>It’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>

<pre><code class="language-Swift">
enum KWSPacketType : Int8 {
    
    case HearBeat
    case Connect
    case Disconnect
    case MoveUp
    case MoveDown
    case Jump
    case Attack
    case DefenseUp
    case DefenseDown
    case Restart
    case GameEnd
}

protocol KWSBlueToothLEDelegate: class {

    func interfaceDidUpdate(interface interface: KWSBluetoothLEInterface, command: KWSPacketType, data: NSData?)
}

class KWSBluetoothLEInterface: NSObject {
    
    weak var delegate : KWSBlueToothLEDelegate?
    weak var ownerViewController : UIViewController?

    var interfaceConnected : Bool = false

    init(ownerController : UIViewController, delegate: KWSBlueToothLEDelegate) {
        
        self.ownerViewController = ownerController
        self.delegate = delegate
        super.init()
    }
    
    func sendCommand(command command: KWSPacketType, data: NSData?) {
        
        self.doesNotRecognizeSelector(Selector(__FUNCTION__))
    }
}


</code></pre>

<p>As you can see, it’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’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 class="language-plaintext highlighter-rouge">KWSBluetoothLEClient</code></p>

<pre><code class="language-Swift">class KWSBluetoothLEClient: KWSBluetoothLEInterface, CBPeripheralManagerDelegate  {
  
 	override func sendCommand(command command: KWSPacketType, data: NSData?) {
    
        if !interfaceConnected {
        
            return
        }
        
        var header : Int8 = command.rawValue
        let dataToSend : NSMutableData = NSMutableData(bytes: &amp;header, length: sizeof(Int8))
        
        if let data = data {
        
            dataToSend.appendData(data)
        }
        
        if dataToSend.length &gt; kKWSMaxPacketSize {
            
            print("Error data packet to long!")
            
            return
        }
        
        self.peripheralManager.updateValue( dataToSend,
                         forCharacteristic: self.readCharacteristic,
                      onSubscribedCentrals: nil)
        
  }

 	func peripheralManager(peripheral: CBPeripheralManager, didReceiveWriteRequests requests: [CBATTRequest]) {
        
        if requests.count == 0 {
            
            return;
        }
        
        for req in requests as [CBATTRequest] {
        
            let data : NSData = req.value!
            let header : NSData = data.subdataWithRange(NSMakeRange(0, sizeof(Int8)))
            
            let remainingVal = data.length - sizeof(Int8)
            
            var body : NSData? = nil
            
            if remainingVal &gt; 0 {
            
                body = data.subdataWithRange(NSMakeRange(sizeof(Int8), remainingVal))
            }
            
            let actionValue : UnsafePointer&lt;Int8&gt; = UnsafePointer&lt;Int8&gt;(header.bytes)
            let action : KWSPacketType = KWSPacketType(rawValue: actionValue.memory)!
            
            self.delegate?.interfaceDidUpdate(interface: self, command: action, data: body)
            
            self.peripheralManager.respondToRequest(req, withResult: CBATTError.Success)
        }
  }
}
</code></pre>

<p><code class="language-plaintext highlighter-rouge">KWSBluetoothLEServer</code></p>

<pre><code class="language-Swift">class KWSBluetoothLEServer: KWSBluetoothLEInterface, CBCentralManagerDelegate, CBPeripheralDelegate {

    override func sendCommand(command command: KWSPacketType, data: NSData?){
        
        if !interfaceConnected {
            
            return
        }

        var header : Int8 = command.rawValue
        let dataToSend : NSMutableData = NSMutableData(bytes: &amp;header, length: sizeof(Int8))
        
        if let data = data {
            
            dataToSend.appendData(data)
        }
        
        if dataToSend.length &gt; kKWSMaxPacketSize {
            
            print("Error data packet to long!")
            
            return
        }
        
        if let discoveredPeripheral = self.discoveredPeripheral {
        
            discoveredPeripheral.writeValue( dataToSend,
                          forCharacteristic: self.writeCharacteristic,
                                       type: .WithResponse)
        }
    }
  
    func peripheral(peripheral: CBPeripheral, didUpdateValueForCharacteristic characteristic: CBCharacteristic, error: NSError?) {
        
        if let error = error {
            print("didUpdateValueForCharacteristic error: \(error.localizedDescription)")
            return
        }
        
        let data : NSData = characteristic.value!
        let header : NSData = data.subdataWithRange(NSMakeRange(0, sizeof(Int8)))
        
        let remainingVal = data.length - sizeof(Int8)
        var body : NSData? = nil
        
        if remainingVal &gt; 0 {
            
            body = data.subdataWithRange(NSMakeRange(sizeof(Int8), remainingVal))
        }

        let actionValue : UnsafePointer&lt;Int8&gt; = UnsafePointer&lt;Int8&gt;(header.bytes)
        let action : KWSPacketType = KWSPacketType(rawValue: actionValue.memory)!
        
        self.delegate?.interfaceDidUpdate(interface: self, command: action, data: body)
    }
}
</code></pre>

<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>

<pre><code class="language-Swift">
func setupGameLogic(becomeServer:Bool) {
    
        self.isServer = becomeServer
        
        if self.isServer {
            
            self.communicationInterface = KWSBluetoothLEServer(ownerController: self, delegate: self)
        }
        else {
            
            self.communicationInterface = KWSBluetoothLEClient(ownerController: self, delegate: self)
        }
   
}
</code></pre>

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

<pre><code class="language-Swift">
//player is dead notify other player
self.communicationInterface!.sendCommand(command: .GameEnd, data: nil)

//send some basic data about your player state (life, position)

let currentPlayer = self.gameScene.selectedPlayer
        
    var packet = syncPacket()
        packet.healt = currentPlayer!.healt
        packet.posx = Float16CompressorCompress(Float32(currentPlayer!.position.x))
        
    let packetData = NSData(bytes: &amp;packet, length: sizeof(syncPacket))
    self.communicationInterface!.sendCommand(command: .HearBeat, data: packetData)

//send some other info 

let directionData = NSData(bytes: &amp;currentPlayer!.movingLeft, length: sizeof(Bool))
self.communicationInterface!.sendCommand(command: .MoveDown, data: directionData)

</code></pre>

<p>Reciving data:</p>

<pre><code class="language-Swift">func interfaceDidUpdate(interface interface: KWSBluetoothLEInterface, command: KWSPacketType, data: NSData?)
{

	switch( command ) {
  
	case .HearBeat:
	if let data = data {
                
		let subData : NSData = data.subdataWithRange(NSMakeRange(0, sizeof(syncPacket)))
		let packetMemory = UnsafePointer&lt;syncPacket&gt;(subData.bytes)
		let packet = packetMemory.memory
                
		self.gameScene.otherPlayer!.healt = packet.healt
		self.gameScene.otherPlayer!.applyDamage(0)
                
		let decoded = Float16CompressorDecompress(packet.posx)
		let realPos = self.gameScene.otherPlayer!.position
		let position = CGPointMake(CGFloat(decoded), CGFloat(realPos.y))
                
		self.gameScene.otherPlayer!.position = position
	}

	case .Jump:
		self.gameScene.otherPlayer!.playerJump()

	case .Restart:
		self.unlockControls()
            
	case .GameEnd:
		self.lockControls()
        
	}
}
</code></pre>

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

<p><img class="center" src="/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’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’t, go ahead and try, you won’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.
<!--more-->
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 class="language-plaintext highlighter-rouge">_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 _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 _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>

<div class="language-objc highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">@interface</span> <span class="nc">OPerson</span><span class="p">:</span> <span class="nc">NSObject</span>

<span class="k">-</span> <span class="p">(</span><span class="n">instancetype</span><span class="p">)</span><span class="nf">initWithName</span><span class="p">:(</span><span class="n">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="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">surname</span><span class="p">;</span>

<span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">copy</span><span class="p">)</span> <span class="p">(</span><span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="n">name</span><span class="p">;</span>
<span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">copy</span><span class="p">)</span> <span class="p">(</span><span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="n">surname</span><span class="p">;</span>

<span class="k">@end</span>
</code></pre></div></div>

<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 class="language-plaintext highlighter-rouge">_ObjectiveCBridgeable</code>, like so:</p>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">struct</span> <span class="kt">Person</span> <span class="p">{</span>
        <span class="k">let</span> <span class="nv">name</span><span class="p">:</span> <span class="kt">String</span>
        <span class="k">let</span> <span class="nv">surname</span><span class="p">:</span> <span class="kt">String</span>
<span class="p">}</span>

<span class="kd">extension</span> <span class="kt">Person</span><span class="p">:</span> <span class="n">_ObjectiveCBridgeable</span> <span class="p">{</span>

    <span class="kd">typealias</span> <span class="n">_ObjectiveCType</span> <span class="o">=</span> <span class="kt">OPerson</span>

    <span class="kd">static</span> <span class="kd">func</span> <span class="nf">_isBridgedToObjectiveC</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="kt">Bool</span> <span class="p">{</span>
            <span class="k">return</span> <span class="n">type</span>
    <span class="p">}</span>

    <span class="kd">static</span> <span class="kd">func</span> <span class="nf">_getObjectiveCType</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="kt">Any</span><span class="o">.</span><span class="k">Type</span> <span class="p">{</span>
            <span class="k">return</span> <span class="kt">ObjectiveCType</span><span class="o">.</span><span class="k">self</span>
    <span class="p">}</span>

    <span class="kd">func</span> <span class="nf">_bridgeToObjectiveC</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="n">_ObjectiveCType</span> <span class="p">{</span>
            <span class="k">return</span> <span class="kt">OPerson</span><span class="p">(</span><span class="nv">name</span><span class="p">:</span> <span class="n">name</span><span class="p">,</span> <span class="nv">surname</span><span class="p">:</span> <span class="n">surname</span><span class="p">)</span>
    <span class="p">}</span>

    <span class="kd">static</span> <span class="kd">func</span> <span class="nf">_forceBridgeFromObjectiveC</span><span class="p">(</span><span class="nv">source</span><span class="p">:</span> <span class="n">_ObjectiveCType</span><span class="p">,</span> <span class="k">inout</span> <span class="nv">result</span><span class="p">:</span> <span class="kt">Person</span><span class="p">?)</span> <span class="p">{</span>
            <span class="n">result</span> <span class="o">=</span> <span class="kt">Person</span><span class="p">(</span><span class="nv">name</span><span class="p">:</span> <span class="n">source</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="nv">surname</span><span class="p">:</span> <span class="n">source</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
    <span class="p">}</span>

    <span class="kd">static</span> <span class="kd">func</span> <span class="nf">_conditionallyBridgeFRomObjectiveC</span><span class="p">(</span><span class="nv">source</span><span class="p">:</span> <span class="n">_ObjectiveCType</span><span class="p">,</span> <span class="k">inout</span> <span class="nv">result</span><span class="p">:</span> <span class="kt">Person</span><span class="p">?)</span> <span class="o">-&gt;</span> <span class="kt">Bool</span> <span class="p">{</span>
            <span class="nf">_forceBridgeFromObjectiveC</span><span class="p">(</span><span class="n">source</span><span class="p">,</span> <span class="nv">result</span><span class="p">:</span> <span class="o">&amp;</span><span class="n">result</span><span class="p">)</span>
            <span class="k">return</span> <span class="kc">true</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>And voilá!</p>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="k">let</span> <span class="nv">objcPerson</span> <span class="o">=</span> <span class="kt">OPerson</span><span class="p">(</span><span class="nv">name</span><span class="p">:</span> <span class="s">"John"</span><span class="p">,</span> <span class="nv">surname</span><span class="p">:</span> <span class="s">"Doe"</span><span class="p">)</span>

<span class="k">if</span> <span class="k">let</span> <span class="nv">swiftPerson</span> <span class="o">=</span> <span class="n">objcPerson</span> <span class="k">as?</span> <span class="kt">Person</span> <span class="p">{</span>
	<span class="c1">//will work</span>
<span class="p">}</span>

<span class="k">let</span> <span class="nv">swiftPerson</span> <span class="o">=</span> <span class="n">objcPerson</span> <span class="k">as</span> <span class="kt">Person</span> <span class="c1">//this too!</span>

<span class="k">let</span> <span class="nv">swiftPerson2</span> <span class="o">=</span> <span class="kt">Person</span><span class="p">(</span><span class="nv">name</span><span class="p">:</span> <span class="s">"Jack"</span><span class="p">,</span> <span class="nv">surname</span><span class="p">:</span><span class="s">"Doe"</span><span class="p">)</span>
<span class="k">let</span> <span class="nv">objcPerson</span> <span class="o">=</span> <span class="n">swiftPerson2</span> <span class="k">as</span> <span class="kt">OPerson</span> <span class="c1">//and that</span>

<span class="k">let</span> <span class="nv">person</span><span class="p">:</span> <span class="kt">OPerson</span> <span class="o">=</span> <span class="kt">Person</span><span class="p">(</span><span class="nv">name</span><span class="p">:</span> <span class="s">"Alfred"</span><span class="p">,</span> <span class="nv">surname</span><span class="p">:</span> <span class="s">"Doe"</span><span class="p">)</span> <span class="c1">//hooray</span>
</code></pre></div></div>

<p>Oh, that’s so beautiful, don’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 class="language-plaintext highlighter-rouge">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.
<!--more-->
<img class="center" src="/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 class="language-plaintext highlighter-rouge">UITraitEnvironment</code> is a protocol which provides access to trait collection. Its conformed by most of the objects in view hierarchy: <code class="language-plaintext highlighter-rouge">UIScreen</code>, <code class="language-plaintext highlighter-rouge">UIWindow</code>, <code class="language-plaintext highlighter-rouge">UIViewController</code>, <code class="language-plaintext highlighter-rouge">UIView</code>. Every child inherits the trait collection object from its parent. The trick is to override the trait collection in <code class="language-plaintext highlighter-rouge">UIWindow</code> and return a custom value for iPhone 6+ device. Take a look:</p>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">@objc</span> <span class="kd">public</span> <span class="kd">class</span> <span class="kt">Window</span><span class="p">:</span> <span class="kt">UIWindow</span> <span class="p">{</span>

    <span class="k">override</span> <span class="kd">public</span> <span class="k">var</span> <span class="nv">traitCollection</span><span class="p">:</span> <span class="kt">UITraitCollection</span> <span class="p">{</span>

        <span class="k">if</span> <span class="kt">DeviceType</span><span class="o">.</span><span class="n">isIPhone6P</span> <span class="p">{</span>

            <span class="k">var</span> <span class="nv">collections</span> <span class="o">=</span> <span class="p">[</span><span class="kt">UITraitCollection</span><span class="p">(</span><span class="nv">horizontalSizeClass</span><span class="p">:</span> <span class="o">.</span><span class="kt">Compact</span><span class="p">),</span>
                <span class="kt">UITraitCollection</span><span class="p">(</span><span class="nv">verticalSizeClass</span><span class="p">:</span> <span class="o">.</span><span class="kt">Compact</span><span class="p">)]</span>

            <span class="k">return</span> <span class="kt">UITraitCollection</span><span class="p">(</span><span class="nv">traitsFromCollections</span><span class="p">:</span> <span class="n">collections</span><span class="p">)</span>
        <span class="p">}</span>

        <span class="k">return</span> <span class="k">super</span><span class="o">.</span><span class="n">traitCollection</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>We override trait collection in <code class="language-plaintext highlighter-rouge">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="/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="/images/uitraitcollection_trick/3.png" /><br />
<img class="center" src="/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’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.
<!--more-->
To keep things smoothly in the users interface, every single operation that’s schedule to run into the main thread can take longer than 16 milliseconds, and there’s a handy solution to get you covered. It’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’s take a look at how to use it:</p>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">let</span> <span class="nv">watchdog</span> <span class="o">=</span> <span class="kt">Watchdog</span><span class="p">(</span><span class="mf">0.2</span><span class="p">)</span>
</code></pre></div></div>

<p>Just instantiate it with a number of seconds that you want for Watchdog to consider that the main thread blocked. Also don’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>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>👮 Main thread was blocked for 1.25s 👮
</code></pre></div></div>

<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’s necessary to run the application and check for broken layouts. Take this quite simple UI.
<!--more-->
<img class="center" src="/images/autolayout-and-nslocalizedstrings/01.png" width="375" /></p>

<p>Simple, huh?</p>

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

<p>Add <code class="language-plaintext highlighter-rouge">-NSDoubleLocalizedStrings YES</code> to <code class="language-plaintext highlighter-rouge">Arguments Passed On Launch</code> to the <code class="language-plaintext highlighter-rouge">Run</code> section at your <code class="language-plaintext highlighter-rouge">Project Schemes</code>.</p>

<p><img class="center" src="/images/autolayout-and-nslocalizedstrings/02.png" /></p>

<p>This argument will duplicate all strings loaded using <code class="language-plaintext highlighter-rouge">NSLocalizedString</code>.</p>

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

<p>What’s better then that? What about finding out unlocalized strings?</p>

<p>So, <code class="language-plaintext highlighter-rouge">-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 class="language-plaintext highlighter-rouge">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 class="language-plaintext highlighter-rouge">UIMotionEffects</code> is still overlooked. But not today, let’s make something cool with it.</p>

<p>Motion effects is an easy way to react to external variations on the device’s orientation. To say, <code class="language-plaintext highlighter-rouge">UIKit</code> performs UI changes whenever the user tilts the device, vertically or horizontally.</p>

<p>Let’s use <code class="language-plaintext highlighter-rouge">UIInterpolatingMotionEffect</code> a subclass of <code class="language-plaintext highlighter-rouge">UIMotionEffects</code>, with <code class="language-plaintext highlighter-rouge">MapKit</code>. Notice how appealing it is.
<!--more-->
<img class="center" src="/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’re good to go:</p>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">var</span> <span class="nv">horizontalMotionEffect</span> <span class="o">=</span> <span class="kt">UIInterpolatingMotionEffect</span><span class="p">(</span><span class="nv">keyPath</span><span class="p">:</span> <span class="s">"center.x"</span><span class="p">,</span> <span class="nv">type</span><span class="p">:</span> <span class="o">.</span><span class="kt">TiltAlongHorizontalAxis</span><span class="p">)</span>
<span class="n">horizontalMotionEffect</span><span class="o">.</span><span class="n">minimumRelativeValue</span> <span class="o">=</span> <span class="o">-</span><span class="mi">100</span>
<span class="n">horizontalMotionEffect</span><span class="o">.</span><span class="n">maximumRelativeValue</span> <span class="o">=</span> <span class="mi">100</span>

<span class="n">mapView</span><span class="o">.</span><span class="nf">addMotionEffect</span><span class="p">(</span><span class="n">horizontalMotionEffect</span><span class="p">)</span>
</code></pre></div></div>

<p>Think of <code class="language-plaintext highlighter-rouge">minimumRelativeValue</code> and <code class="language-plaintext highlighter-rouge">maximumRelativeValue</code> as leading and tralling constraints, respectivily, to its <code class="language-plaintext highlighter-rouge">superview</code>.</p>

<p>That’s why you have to create the <code class="language-plaintext highlighter-rouge">UIView</code>, <code class="language-plaintext highlighter-rouge">MKMapView</code> in this case, outside its <code class="language-plaintext highlighter-rouge">superview</code>s bounds. Like so:</p>

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

<p>As the user tilts the device, <code class="language-plaintext highlighter-rouge">UIInterpolatingMotionEffect</code> translates the fixed offset values returned by the system to the range of specified values, then <code class="language-plaintext highlighter-rouge">UIKit</code> applies the translated values to any target views.</p>

<p>Don’t forget about this! Details matters and it’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.
<!--more--></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want.
Try this:

(1) look at each constraint and try to figure out which you don't expect;
(2) find the code that added the unwanted constraint or constraints and fix it.
(Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints)

(...........)


Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in &lt;UIKit/UIView.h&gt; may also be helpful.
</code></pre></div></div>

<p>That’s a huge log! And I cut off the <code class="language-plaintext highlighter-rouge">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 class="language-plaintext highlighter-rouge">UIViewAlertForUnsatisfiableConstraints</code>.</p>

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

<p><img class="center" src="/images/autolayout-breakpoints/1.png" /></p>

<p>Honestly, that won’t help much, because basically it’ll just stop the execution and leave you up with <code class="language-plaintext highlighter-rouge">LLDB</code>, alone in the dark.</p>

<p>But there’s a little trick you can do to enhance the preceding symbolic breakpoint.
Adding <code class="language-plaintext highlighter-rouge">po [[UIWindow keyWindow] _autolayoutTrace]</code> to it (for Obj-C projects) or <code class="language-plaintext highlighter-rouge">expr -l objc++ -O -- [[UIWindow keyWindow] _autolayoutTrace]</code> (for Swift projects).</p>

<p><img class="center" src="/images/autolayout-breakpoints/2.png" /></p>

<p>Now, on console, you’ll see all the <code class="language-plaintext highlighter-rouge">UIView</code> hierarchy and exactly where it has ambiguity.</p>

<div class="language-objc highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nl">UIWindow:</span><span class="mh">0x7f9481c93360</span>
<span class="o">|</span>   <span class="err">•</span><span class="n">UIView</span><span class="o">:</span><span class="mh">0x7f9481c9d680</span>
<span class="o">|</span>   <span class="o">|</span>   <span class="o">*</span><span class="n">UIView</span><span class="o">:</span><span class="mh">0x7f9481c9d990</span><span class="k">-</span> <span class="n">AMBIGUOUS</span> <span class="n">LAYOUT</span> <span class="k">for</span> <span class="n">UIView</span><span class="o">:</span><span class="mh">0x7f9481c9d990</span><span class="p">.</span><span class="n">minX</span><span class="p">{</span><span class="n">id</span><span class="o">:</span> <span class="mi">13</span><span class="p">},</span> <span class="n">UIView</span><span class="o">:</span><span class="mh">0x7f9481c9d990</span><span class="p">.</span><span class="n">minY</span><span class="p">{</span><span class="n">id</span><span class="o">:</span> <span class="mi">16</span><span class="p">}</span>
<span class="o">|</span>   <span class="o">|</span>   <span class="o">*</span><span class="n">_UILayoutGuide</span><span class="o">:</span><span class="mh">0x7f9481c9e160</span><span class="k">-</span> <span class="n">AMBIGUOUS</span> <span class="n">LAYOUT</span> <span class="k">for</span> <span class="n">_UILayoutGuide</span><span class="o">:</span><span class="mh">0x7f9481c9e160</span><span class="p">.</span><span class="n">minY</span><span class="p">{</span><span class="n">id</span><span class="o">:</span> <span class="mi">17</span><span class="p">}</span>
<span class="o">|</span>   <span class="o">|</span>   <span class="o">*</span><span class="n">_UILayoutGuide</span><span class="o">:</span><span class="mh">0x7f9481c9ebb0</span><span class="k">-</span> <span class="n">AMBIGUOUS</span> <span class="n">LAYOUT</span> <span class="k">for</span> <span class="n">_UILayoutGuide</span><span class="o">:</span><span class="mh">0x7f9481c9ebb0</span><span class="p">.</span><span class="n">minY</span><span class="p">{</span><span class="n">id</span><span class="o">:</span> <span class="mi">27</span><span class="p">}</span>
</code></pre></div></div>

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

<div class="language-objc highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="n">lldb</span><span class="p">)</span> <span class="n">expr</span> <span class="p">((</span><span class="n">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="n">UIColor</span> <span class="nf">redColor</span><span class="p">]</span>
<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>
</code></pre></div></div>

<p>Fear no more young Padawan, make symbolic breakpoints and <code class="language-plaintext highlighter-rouge">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 class="language-plaintext highlighter-rouge">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.
<!--more-->
I will try to present it to you in a short way:</p>
<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">let</span> <span class="nv">parentProgress</span> <span class="o">=</span> <span class="kt">NSProgress</span><span class="p">()</span>
<span class="n">parentProgress</span><span class="o">.</span><span class="n">totalUnitCount</span> <span class="o">=</span> <span class="mi">2</span>
<span class="n">parentProgress</span><span class="o">.</span><span class="nf">becomeCurrentWithPendingUnitCount</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>

<span class="k">let</span> <span class="nv">childProgress</span> <span class="o">=</span> <span class="kt">NSProgress</span><span class="p">(</span><span class="nv">totalUnitCount</span><span class="p">:</span><span class="mi">1</span><span class="p">)</span>
<span class="n">parentProgress</span><span class="o">.</span><span class="nf">resignCurrent</span><span class="p">()</span>
</code></pre></div></div>
<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>
<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">let</span> <span class="nv">parentProgress</span> <span class="o">=</span> <span class="kt">NSProgress</span><span class="p">()</span>
<span class="k">let</span> <span class="nv">childProgress</span> <span class="o">=</span> <span class="kt">NSProgress</span><span class="p">()</span>
<span class="n">parentProgress</span><span class="o">.</span><span class="nf">addChild</span><span class="p">(</span><span class="n">childProgress</span><span class="p">,</span> <span class="nv">withPendingUnitCount</span><span class="p">:</span><span class="mi">1</span><span class="p">)</span>
</code></pre></div></div>

<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>
<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">protocol</span> <span class="kt">NSProgressReporting</span> <span class="p">:</span> <span class="kt">NSObjectProtocol</span> <span class="p">{</span>
    <span class="k">var</span> <span class="nv">progress</span><span class="p">:</span> <span class="kt">NSProgress</span> <span class="p">{</span> <span class="k">get</span> <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>
<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’s blog post</a> about using SQL instead of <code class="language-plaintext highlighter-rouge">NSDateFormatter</code> when it comes to parsing dates in your project. If you don’t read it yet, I will highly recommend to do it now. This time we will use Swift to make same measurements.
<!--more-->
TL;DR:</p>

<p>You can use sql database function <code class="language-plaintext highlighter-rouge">strftime</code> to get UNIX time from e.g.: ISO8061 date string.</p>

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

<div class="language-objc highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">+</span> <span class="p">(</span><span class="n">NSArray</span> <span class="o">*</span><span class="p">)</span><span class="nf">parseDatesUsingStringArray</span><span class="p">:(</span><span class="n">NSArray</span> <span class="o">*</span><span class="p">)</span><span class="nv">stringsArray</span>
<span class="p">{</span>
    <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 class="n">sqlite3_open</span><span class="p">(</span><span class="s">":memory:"</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">db</span><span class="p">);</span>
    
    <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 class="n">sqlite3_prepare_v2</span><span class="p">(</span><span class="n">db</span><span class="p">,</span> <span class="s">"SELECT strftime('%s', ?);"</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 class="n">NSMutableArray</span> <span class="o">*</span><span class="n">datesArray</span> <span class="o">=</span> <span class="p">[</span><span class="n">NSMutableArray</span> <span class="nf">array</span><span class="p">];</span>
    
    <span class="k">for</span> <span class="p">(</span><span class="n">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 class="p">{</span>
        <span class="n">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="nf">i</span><span class="p">];</span>
        
        <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="nf">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 class="n">sqlite3_step</span><span class="p">(</span><span class="n">statement</span><span class="p">);</span>
        
        <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 class="n">NSDate</span> <span class="o">*</span><span class="n">date</span> <span class="o">=</span> <span class="p">[</span><span class="n">NSDate</span> <span class="nf">dateWithTimeIntervalSince1970</span><span class="p">:</span><span class="n">value</span><span class="p">];</span>
        
        <span class="p">[</span><span class="n">datesArray</span> <span class="nf">addObject</span><span class="p">:</span><span class="n">date</span><span class="p">];</span>
        
        <span class="n">sqlite3_clear_bindings</span><span class="p">(</span><span class="n">statement</span><span class="p">);</span>
        <span class="n">sqlite3_reset</span><span class="p">(</span><span class="n">statement</span><span class="p">);</span>
    <span class="p">}</span>
    
    <span class="n">sqlite3_close</span><span class="p">(</span><span class="n">db</span><span class="p">);</span>
    
    <span class="k">return</span> <span class="n">datesArray</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

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

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">var</span> <span class="nv">datesFromNSDateFormatter</span><span class="p">:[</span><span class="kt">NSDate</span><span class="p">]</span> <span class="o">=</span> <span class="p">[]</span>

<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 class="n">datesFromNSDateFormatter</span><span class="o">.</span><span class="nf">append</span><span class="p">(</span><span class="kt">NSDateFormatter</span><span class="o">.</span><span class="nf">dateFromISOString</span><span class="p">(</span><span class="n">string</span><span class="p">))</span>
<span class="p">}</span>
</code></pre></div></div>

<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>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Time elapsed for NSDateFromatter parsing: 73.7988719940186 s
Time elapsed for SQLDateFormatter parsing: 8.51147103309631 s
</code></pre></div></div>

<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’m using better CPU so <code class="language-plaintext highlighter-rouge">NSDateFormatter</code> is still very very slow… 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’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’s this Demeter guy</a>. Regardless of it, the Law of Demeter (LoD) is a foundation concept that’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.
<!--more-->
There’s a particular situation that occurs with iOS, that’s perfect for applying the LoD. Sometimes it’s needed to call method in our <code class="language-plaintext highlighter-rouge">UIApplicationDelegate</code>. The common way of doing that is the following:</p>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">let</span> <span class="nv">sharedApplication</span> <span class="o">=</span> <span class="kt">UIApplication</span><span class="o">.</span><span class="nf">sharedApplication</span><span class="p">()</span>
<span class="k">let</span> <span class="nv">delegate</span> <span class="o">=</span> <span class="n">sharedApplication</span><span class="o">.</span><span class="n">delegate</span>
<span class="k">if</span> <span class="k">let</span> <span class="nv">delegate</span> <span class="o">=</span> <span class="n">delegate</span> <span class="k">as?</span> <span class="kt">AppDelegate</span> <span class="p">{</span>
    <span class="n">delegate</span><span class="o">.</span><span class="nf">doSomething</span><span class="p">()</span>
<span class="p">}</span>
</code></pre></div></div>
<p>There are too many temporary objects, and presumably, there’s no reason why this class should know about <code class="language-plaintext highlighter-rouge">AppDelegate</code> casting and so on.</p>

<p>Using the <code class="language-plaintext highlighter-rouge">Decorator</code> pattern, is a way to wrap up this logic and decouple stuff.</p>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">extension</span> <span class="kt">UIApplication</span> <span class="p">{</span>
    <span class="kd">class</span> <span class="kd">func</span> <span class="nf">myDelegate</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="kt">AppDelegate</span> <span class="p">{</span>
        <span class="nf">return</span> <span class="p">(</span><span class="k">self</span><span class="o">.</span><span class="nf">sharedApplication</span><span class="p">()</span><span class="o">.</span><span class="n">delegate</span> <span class="k">as!</span> <span class="kt">AppDelegate</span><span class="p">)</span>
    <span class="p">}</span>
    <span class="kd">class</span> <span class="kd">func</span> <span class="nf">doSomething</span><span class="p">()</span> <span class="p">{</span>
        <span class="nf">myDelegate</span><span class="p">()</span><span class="o">.</span><span class="nf">doSomething</span><span class="p">()</span>
    <span class="p">}</span>
<span class="p">}</span>

<span class="kd">extension</span> <span class="kt">AppDelegate</span> <span class="p">{</span>
    <span class="kd">class</span> <span class="kd">func</span> <span class="nf">doSomething</span><span class="p">()</span> <span class="p">{</span>
        <span class="kt">UIApplication</span><span class="o">.</span><span class="nf">doSomething</span><span class="p">()</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Now the class would just call <code class="language-plaintext highlighter-rouge">UIApplication.doSomething()</code> or <code class="language-plaintext highlighter-rouge">AppDelegate.doSomething()</code>.</p>

<p>Another situation that’s a claimer for LoD is when you have chained ‘get’ statements, for example:</p>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">let</span> <span class="nv">myDesire</span> <span class="o">=</span> <span class="kt">Metallica</span><span class="p">()</span><span class="o">.</span><span class="nf">gimmeFuel</span><span class="p">()</span><span class="o">.</span><span class="nf">gimmeFire</span><span class="p">()</span><span class="o">.</span><span class="nf">gimmeThatWhichIDesire</span><span class="p">()</span>
</code></pre></div></div>

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

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">class</span> <span class="kt">Metallica</span> <span class="p">{</span>
    <span class="kd">func</span> <span class="nf">fuelSetOnFire</span><span class="p">(</span><span class="nv">fuel</span><span class="p">:</span> <span class="kt">Fuel</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kt">Fire</span> <span class="p">{</span>
    	<span class="k">return</span> <span class="kt">Fire</span><span class="o">.</span><span class="nf">setFuelOnFire</span><span class="p">(</span><span class="n">fuel</span><span class="p">)</span>
    <span class="p">}</span>
    
    <span class="kd">func</span> <span class="nf">gimmeThatWhichIDesire</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="kt">Desire</span> <span class="p">{</span>
        <span class="k">return</span> <span class="kt">Desire</span><span class="o">.</span><span class="nf">fromFire</span><span class="p">(</span><span class="nf">fuelSetOnFire</span><span class="p">(</span><span class="n">metallicasFuel</span><span class="p">))</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<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.
<!--more-->
As usual create new <code class="language-plaintext highlighter-rouge">Run Script Phase</code> and insert your Bash script:</p>

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

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

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">echo</span> <span class="s2">"note: Starting script phase.”
echo "</span>warning: testing <span class="k">for </span>Debug target<span class="s2">"

if [ "</span>Debug<span class="s2">"= "</span><span class="k">${</span><span class="nv">CONFIGURATION</span><span class="k">}</span><span class="s2">" ];
then
    echo "</span>error: please run this script on Release target<span class="s2">"
else
    echo "</span>warning: running on Debug target<span class="s2">"
fi
</span></code></pre></div></div>

<p>Please, take a look in every echo at <code class="language-plaintext highlighter-rouge">note:</code>, <code class="language-plaintext highlighter-rouge">warning:</code> and <code class="language-plaintext highlighter-rouge">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="/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’m a huge fan of <code class="language-plaintext highlighter-rouge">UICollectionView</code>. It’s way more customizable than his older brother <code class="language-plaintext highlighter-rouge">UITableView</code>. Nowadays I use collection view even more often than table view. With iOS 9 it supports easy reordering. Before it wasn’t possible out of the box, and to do so means painful work. Let’s have look at the API. You can find the accompanying Xcode project <a href="https://github.com/nshint/uicollectionview-reordering">on GitHub</a>.
<!--more-->
The easiest way to add easy reordering is to use <code class="language-plaintext highlighter-rouge">UICollectionViewController</code>. It now has a new property called <code class="language-plaintext highlighter-rouge">installsStandardGestureForInteractiveMovement</code> which adds standard gestures to reorder cells. This property is <code class="language-plaintext highlighter-rouge">true</code> by default, which means that there’s only one method we should to override to get things working.</p>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">override</span> <span class="kd">func</span> <span class="nf">collectionView</span><span class="p">(</span><span class="nv">collectionView</span><span class="p">:</span> <span class="kt">UICollectionView</span><span class="p">,</span> 
    <span class="n">moveItemAtIndexPath</span> <span class="nv">sourceIndexPath</span><span class="p">:</span> <span class="kt">NSIndexPath</span><span class="p">,</span> 
    <span class="n">toIndexPath</span> <span class="nv">destinationIndexPath</span><span class="p">:</span> <span class="kt">NSIndexPath</span><span class="p">)</span> <span class="p">{</span>
    <span class="c1">// move your data order</span>
<span class="p">}</span>
</code></pre></div></div>
<p>The collection view infers that items can be moved because <code class="language-plaintext highlighter-rouge">moveItemAtIndexPath</code> is overrired.</p>

<p><img class="center" src="/images/uicollectionview-reordering/1.gif" /></p>

<p>Things go complicated when we want to use a simple <code class="language-plaintext highlighter-rouge">UIViewController</code> with collection view. We also need to implement <code class="language-plaintext highlighter-rouge">UICollectionViewDataSource</code> methods mentioned above, but we need to rewrite <code class="language-plaintext highlighter-rouge">installsStandardGestureForInteractiveMovement</code>. No worries, it’s also easily supported.<code class="language-plaintext highlighter-rouge">UILongPressGestureRecognizer</code> is a continuous gesture recognizer and fully supports panning.</p>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">override</span> <span class="kd">func</span> <span class="nf">viewDidLoad</span><span class="p">()</span> <span class="p">{</span>
    <span class="k">super</span><span class="o">.</span><span class="nf">viewDidLoad</span><span class="p">()</span>

            <span class="n">longPressGesture</span> <span class="o">=</span> <span class="kt">UILongPressGestureRecognizer</span><span class="p">(</span><span class="nv">target</span><span class="p">:</span> <span class="k">self</span><span class="p">,</span> <span class="nv">action</span><span class="p">:</span> <span class="s">"handleLongGesture:"</span><span class="p">)</span>
        <span class="k">self</span><span class="o">.</span><span class="n">collectionView</span><span class="o">.</span><span class="nf">addGestureRecognizer</span><span class="p">(</span><span class="n">longPressGesture</span><span class="p">)</span>
<span class="p">}</span>

    <span class="kd">func</span> <span class="nf">handleLongGesture</span><span class="p">(</span><span class="nv">gesture</span><span class="p">:</span> <span class="kt">UILongPressGestureRecognizer</span><span class="p">)</span> <span class="p">{</span>
        
        <span class="k">switch</span><span class="p">(</span><span class="n">gesture</span><span class="o">.</span><span class="n">state</span><span class="p">)</span> <span class="p">{</span>
            
        <span class="k">case</span> <span class="kt">UIGestureRecognizerState</span><span class="o">.</span><span class="kt">Began</span><span class="p">:</span>
            <span class="k">guard</span> <span class="k">let</span> <span class="nv">selectedIndexPath</span> <span class="o">=</span> <span class="k">self</span><span class="o">.</span><span class="n">collectionView</span><span class="o">.</span><span class="nf">indexPathForItemAtPoint</span><span class="p">(</span><span class="n">gesture</span><span class="o">.</span><span class="nf">locationInView</span><span class="p">(</span><span class="k">self</span><span class="o">.</span><span class="n">collectionView</span><span class="p">))</span> <span class="k">else</span> <span class="p">{</span>
                <span class="k">break</span>
            <span class="p">}</span>
            <span class="n">collectionView</span><span class="o">.</span><span class="nf">beginInteractiveMovementForItemAtIndexPath</span><span class="p">(</span><span class="n">selectedIndexPath</span><span class="p">)</span>
        <span class="k">case</span> <span class="kt">UIGestureRecognizerState</span><span class="o">.</span><span class="kt">Changed</span><span class="p">:</span>
            <span class="n">collectionView</span><span class="o">.</span><span class="nf">updateInteractiveMovementTargetPosition</span><span class="p">(</span><span class="n">gesture</span><span class="o">.</span><span class="nf">locationInView</span><span class="p">(</span><span class="n">gesture</span><span class="o">.</span><span class="n">view</span><span class="o">!</span><span class="p">))</span>
        <span class="k">case</span> <span class="kt">UIGestureRecognizerState</span><span class="o">.</span><span class="kt">Ended</span><span class="p">:</span>
            <span class="n">collectionView</span><span class="o">.</span><span class="nf">endInteractiveMovement</span><span class="p">()</span>
        <span class="k">default</span><span class="p">:</span>
            <span class="n">collectionView</span><span class="o">.</span><span class="nf">cancelInteractiveMovement</span><span class="p">()</span>
        <span class="p">}</span>
    <span class="p">}</span>
</code></pre></div></div>

<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 class="language-plaintext highlighter-rouge">beginInteractiveMovementForItemAtIndexPath(indexPath: NSIndexPath)</code> which starts interactive movement for cell at specific index path</li>
  <li><code class="language-plaintext highlighter-rouge">updateInteractiveMovementTargetPosition(targetPosition: CGPoint)</code> which updates interactive movement target position during gesture</li>
  <li><code class="language-plaintext highlighter-rouge">endInteractiveMovement()</code> which ends interactive movement after you finish pan gesture</li>
  <li><code class="language-plaintext highlighter-rouge">cancelInteractiveMovement()</code> which cancels interactive movement</li>
</ul>

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

<p><img class="center" src="/images/uicollectionview-reordering/2.gif" /></p>

<p>The behavior is the same as with standard <code class="language-plaintext highlighter-rouge">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="/images/uicollectionview-reordering/3.gif" /></p>

<p>Uhm, looks cool, but what if we don’t want to change cell size during movement? Selected cell size during interactive movement should remain the same. This is possible. <code class="language-plaintext highlighter-rouge">UICollectionViewLayout</code> also gets additional methods to handle reordering.</p>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">func</span> <span class="nf">invalidationContextForInteractivelyMovingItems</span><span class="p">(</span><span class="nv">targetIndexPaths</span><span class="p">:</span> <span class="p">[</span><span class="kt">NSIndexPath</span><span class="p">],</span> 
    <span class="n">withTargetPosition</span> <span class="nv">targetPosition</span><span class="p">:</span> <span class="kt">CGPoint</span><span class="p">,</span> 
    <span class="nv">previousIndexPaths</span><span class="p">:</span> <span class="p">[</span><span class="kt">NSIndexPath</span><span class="p">],</span> 
    <span class="nv">previousPosition</span><span class="p">:</span> <span class="kt">CGPoint</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kt">UICollectionViewLayoutInvalidationContext</span>

<span class="kd">func</span> <span class="nf">invalidationContextForEndingInteractiveMovementOfItemsToFinalIndexPaths</span><span class="p">(</span><span class="nv">indexPaths</span><span class="p">:</span> <span class="p">[</span><span class="kt">NSIndexPath</span><span class="p">],</span> 
    <span class="nv">previousIndexPaths</span><span class="p">:</span> <span class="p">[</span><span class="kt">NSIndexPath</span><span class="p">],</span> 
    <span class="nv">movementCancelled</span><span class="p">:</span> <span class="kt">Bool</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kt">UICollectionViewLayoutInvalidationContext</span>
</code></pre></div></div>

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

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">internal</span> <span class="k">override</span> <span class="kd">func</span> <span class="nf">invalidationContextForInteractivelyMovingItems</span><span class="p">(</span><span class="nv">targetIndexPaths</span><span class="p">:</span> <span class="p">[</span><span class="kt">NSIndexPath</span><span class="p">],</span>
    <span class="n">withTargetPosition</span> <span class="nv">targetPosition</span><span class="p">:</span> <span class="kt">CGPoint</span><span class="p">,</span> 
    <span class="nv">previousIndexPaths</span><span class="p">:</span> <span class="p">[</span><span class="kt">NSIndexPath</span><span class="p">],</span> 
    <span class="nv">previousPosition</span><span class="p">:</span> <span class="kt">CGPoint</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kt">UICollectionViewLayoutInvalidationContext</span> <span class="p">{</span>

    <span class="k">var</span> <span class="nv">context</span> <span class="o">=</span> <span class="k">super</span><span class="o">.</span><span class="nf">invalidationContextForInteractivelyMovingItems</span><span class="p">(</span><span class="n">targetIndexPaths</span><span class="p">,</span> 
        <span class="nv">withTargetPosition</span><span class="p">:</span> <span class="n">targetPosition</span><span class="p">,</span> <span class="nv">previousIndexPaths</span><span class="p">:</span> <span class="n">previousIndexPaths</span><span class="p">,</span> 
        <span class="nv">previousPosition</span><span class="p">:</span> <span class="n">previousPosition</span><span class="p">)</span>

    <span class="k">self</span><span class="o">.</span><span class="n">delegate</span><span class="p">?</span><span class="o">.</span><span class="nf">collectionView</span><span class="o">!</span><span class="p">(</span><span class="k">self</span><span class="o">.</span><span class="n">collectionView</span><span class="o">!</span><span class="p">,</span> <span class="nv">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 class="nv">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 class="k">return</span> <span class="n">context</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Solution is straightforward. Grab previous and target index paths of currently moving cell. Then call <code class="language-plaintext highlighter-rouge">UICollectionViewDataSource</code> method to move this items around.</p>

<p><img class="center" src="/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-12T19:00:40+02: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’s become more and more popular with multicore processors. One thing it’s for sure, debugging multithread applications is tough.</p>

<p>iOS has some gotchas regarding multithread, things that if you don’t respect, may cause your application to crash or hang the users interface, for example:
<!--more--></p>
<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="/images/shared-breakpoints/1.png" />
We can solve those situations by using the so called <code class="language-plaintext highlighter-rouge">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="/images/shared-breakpoints/2.png" /></p>
<ul>
  <li>Go to your <code class="language-plaintext highlighter-rouge">.xcodeproj</code> or <code class="language-plaintext highlighter-rouge">.xcworkspace</code> file, right click on it, and choose <code class="language-plaintext highlighter-rouge">Show Package Contents</code>.<br /></li>
  <li>Open the folder <code class="language-plaintext highlighter-rouge">xcshareddata</code>, then <code class="language-plaintext highlighter-rouge">xcdebugger</code> (create them if not exists).<br /></li>
  <li>Breakpoints are saved into <code class="language-plaintext highlighter-rouge">Breakpoints_v2.xcbkptlist</code>.<br /></li>
  <li>Now you just have to paste the following content into the <code class="language-plaintext highlighter-rouge">&lt;Breakpoints&gt;</code> node.</li>
</ul>

<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 class="language-plaintext highlighter-rouge">LLDB</code> commands</a>, but those won’t show up on the Breakpoints navigator)</p>

<p><img class="center" src="/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’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="/images/shared-breakpoints/4.png" /></p>
]]></content>
  </entry>
  
</feed>
