<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="/feed.xml" rel="self" type="application/atom+xml" /><link href="/" rel="alternate" type="text/html" /><updated>2025-09-28T23:40:25+00:00</updated><id>/feed.xml</id><title type="html">Ray Fix’s Blog</title><subtitle>Welcome. This is Ray Fix&apos;s personal blog. A stream of consciousness series of  ramblings intended for a future self.</subtitle><entry><title type="html">Strict Memory Safety</title><link href="/2025/09/26/strict-memory-safety.html" rel="alternate" type="text/html" title="Strict Memory Safety" /><published>2025-09-26T00:00:00+00:00</published><updated>2025-09-26T00:00:00+00:00</updated><id>/2025/09/26/strict-memory-safety</id><content type="html" xml:base="/2025/09/26/strict-memory-safety.html"><![CDATA[<p>One of the features in Swift 6.2 is the ability to turn on strict memory safety checking. It makes it easy to audit unsafe calls by requiring you to add the new
<code class="language-plaintext highlighter-rouge">unsafe</code> keyword to any expression that calls something <code class="language-plaintext highlighter-rouge">@unsafe</code> or uses an unsafe
parameter. This can be done in Xcode 26 by setting “Strict Memory Safety” to “Yes” or, in the case of a Swift package, turning the feature on.</p>

<p>In a Swift package you must first use the latest tools:</p>

<pre><code class="language-none">// swift-tools-version: 6.2
</code></pre>

<p>and in the target specify the <code class="language-plaintext highlighter-rouge">.stringMemorySafety(condition)</code></p>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="o">.</span><span class="nf">target</span><span class="p">(</span><span class="nv">name</span><span class="p">:</span> <span class="s">"uuid-exploration"</span><span class="p">),</span>
        <span class="nv">swiftSettings</span><span class="p">:</span> <span class="p">[</span><span class="o">.</span><span class="nf">strictMemorySafety</span><span class="p">(),</span> <span class="o">.</span><span class="nf">treatAllWarnings</span><span class="p">(</span><span class="nv">as</span><span class="p">:</span> <span class="o">.</span><span class="n">error</span><span class="p">)])</span>
</code></pre></div></div>

<p>You then get warnings (errors if you wish to treat them that way) for all the places that use unsafe constructs:</p>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="nf">withUnsafeMutableBytes</span><span class="p">(</span><span class="nv">of</span><span class="p">:</span> <span class="o">&amp;</span><span class="n">random</span><span class="p">)</span> <span class="p">{</span> <span class="n">raw</span> <span class="k">in</span>
    <span class="k">let</span> <span class="nv">result</span> <span class="o">=</span> <span class="kt">SecRandomCopyBytes</span><span class="p">(</span><span class="n">kSecRandomDefault</span><span class="p">,</span> <span class="mi">10</span><span class="p">,</span> <span class="n">raw</span><span class="o">.</span><span class="n">baseAddress</span><span class="o">!</span><span class="p">)</span>
    <span class="nf">precondition</span><span class="p">(</span><span class="n">result</span> <span class="o">==</span> <span class="n">errSecSuccess</span><span class="p">)</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Needs to be changed to:</p>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">unsafe</span> <span class="nf">withUnsafeMutableBytes</span><span class="p">(</span><span class="nv">of</span><span class="p">:</span> <span class="o">&amp;</span><span class="n">random</span><span class="p">)</span> <span class="p">{</span> <span class="n">raw</span> <span class="k">in</span>
    <span class="k">let</span> <span class="nv">result</span> <span class="o">=</span> <span class="n">unsafe</span> <span class="kt">SecRandomCopyBytes</span><span class="p">(</span><span class="n">kSecRandomDefault</span><span class="p">,</span> <span class="mi">10</span><span class="p">,</span> <span class="n">raw</span><span class="o">.</span><span class="n">baseAddress</span><span class="o">!</span><span class="p">)</span>
    <span class="nf">precondition</span><span class="p">(</span><span class="n">result</span> <span class="o">==</span> <span class="n">errSecSuccess</span><span class="p">)</span>
<span class="p">}</span>
</code></pre></div></div>

<p>All of the details are in the proposal, of course, which you can read here:</p>

<ul>
  <li><a href="https://github.com/swiftlang/swift-evolution/blob/main/proposals/0458-strict-memory-safety.md">https://github.com/swiftlang/swift-evolution/blob/main/proposals/0458-strict-memory-safety.md</a></li>
</ul>]]></content><author><name></name></author><category term="swift" /><category term="memory-safety" /><category term="swiftpm" /><summary type="html"><![CDATA[One of the features in Swift 6.2 is the ability to turn on strict memory safety checking. It makes it easy to audit unsafe calls by requiring you to add the new unsafe keyword to any expression that calls something @unsafe or uses an unsafe parameter. This can be done in Xcode 26 by setting “Strict Memory Safety” to “Yes” or, in the case of a Swift package, turning the feature on.]]></summary></entry><entry><title type="html">Extensible API in Swift</title><link href="/2021/07/27/extensible-api-swift.html" rel="alternate" type="text/html" title="Extensible API in Swift" /><published>2021-07-27T00:00:00+00:00</published><updated>2021-07-27T00:00:00+00:00</updated><id>/2021/07/27/extensible-api-swift</id><content type="html" xml:base="/2021/07/27/extensible-api-swift.html"><![CDATA[<p>A Swift enumeration case lets you clearly spell out a mode of operation in the call site of a function. The downside is that by their nature they are “closed” and can’t be extended from outside the library they are declared. Once you define then, that’s it, they can’t be extended without another release.  Recent additions to Swift 5.5 give you more tools fore creating API that is both ergonomic and extensible.</p>

<p>Consider the following contrived example:</p>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">struct</span> <span class="kt">Item</span> <span class="p">{</span>
  <span class="k">var</span> <span class="nv">name</span><span class="p">:</span> <span class="kt">String</span>
  <span class="k">var</span> <span class="nv">date</span><span class="p">:</span> <span class="kt">Date</span>

  <span class="kd">enum</span> <span class="kt">Sorting</span> <span class="p">{</span>
    <span class="k">case</span> <span class="k">none</span>
    <span class="k">case</span> <span class="n">name</span>

    <span class="kd">func</span> <span class="nf">sort</span><span class="p">(</span><span class="n">_</span> <span class="nv">input</span><span class="p">:</span> <span class="p">[</span><span class="kt">Item</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="p">[</span><span class="kt">Item</span><span class="p">]</span> <span class="p">{</span>
      <span class="k">switch</span> <span class="k">self</span> <span class="p">{</span>
      <span class="k">case</span> <span class="o">.</span><span class="nv">none</span><span class="p">:</span>
        <span class="k">return</span> <span class="n">input</span>
      <span class="k">case</span> <span class="o">.</span><span class="nv">name</span><span class="p">:</span>
        <span class="k">return</span> <span class="n">input</span><span class="o">.</span><span class="n">sorted</span> <span class="p">{</span> <span class="nv">$0</span><span class="o">.</span><span class="n">name</span> <span class="o">&lt;</span> <span class="nv">$1</span><span class="o">.</span><span class="n">name</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 code creates a simple model and the ability to sort it a few different ways.  The definition is closed because as a user of this model, you would need to add to the enumeration and add to switch statement to get a different sorting.  (Or make a whole new abstraction altogether.)</p>

<p>That’s where <a href="https://github.com/apple/swift-evolution/blob/main/proposals/0299-extend-generic-static-member-lookup.md">SE-0299: Extending Static Member Lookup in Generic Contexts</a> come into play.</p>

<p>As an alternate design to an enumeration you can define a protocol:</p>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">protocol</span> <span class="kt">ItemSorting</span> <span class="p">{</span>
  <span class="kd">func</span> <span class="nf">sorted</span><span class="p">(</span><span class="n">_</span> <span class="nv">items</span><span class="p">:</span> <span class="p">[</span><span class="kt">Item</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="p">[</span><span class="kt">Item</span><span class="p">]</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Then you can provide a generic function for sorting.</p>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">extension</span> <span class="kt">Array</span> <span class="k">where</span> <span class="kt">Element</span> <span class="o">==</span> <span class="kt">Item</span> <span class="p">{</span>
  <span class="kd">func</span> <span class="n">sorted</span><span class="o">&lt;</span><span class="kt">Method</span><span class="p">:</span> <span class="kt">ItemSorting</span><span class="o">&gt;</span><span class="p">(</span><span class="n">using</span> <span class="nv">method</span><span class="p">:</span> <span class="kt">Method</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="p">[</span><span class="kt">Item</span><span class="p">]</span> <span class="p">{</span>
    <span class="n">method</span><span class="o">.</span><span class="nf">sorted</span><span class="p">(</span><span class="k">self</span><span class="p">)</span>
  <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Here, the sort method is defined as part of arrays of <code class="language-plaintext highlighter-rouge">Items</code>.  You could also make it a free function but adding it as part of arrays makes it nice and discoverable.</p>

<p>To specify the <code class="language-plaintext highlighter-rouge">.none</code> and <code class="language-plaintext highlighter-rouge">name</code> item sorting as before, your library could provide the following:</p>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="c1">// .none item sorting</span>

<span class="kd">struct</span> <span class="kt">NoneItemSorting</span><span class="p">:</span> <span class="kt">ItemSorting</span> <span class="p">{</span>
  <span class="kd">func</span> <span class="nf">sorted</span><span class="p">(</span><span class="n">_</span> <span class="nv">items</span><span class="p">:</span> <span class="p">[</span><span class="kt">Item</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="p">[</span><span class="kt">Item</span><span class="p">]</span> <span class="p">{</span>
    <span class="n">items</span>
  <span class="p">}</span>
<span class="p">}</span>

<span class="kd">extension</span> <span class="kt">ItemSorting</span> <span class="k">where</span> <span class="k">Self</span> <span class="o">==</span> <span class="kt">NoneItemSorting</span> <span class="p">{</span>
  <span class="kd">static</span> <span class="k">var</span> <span class="nv">none</span><span class="p">:</span> <span class="kt">NoneItemSorting</span> <span class="p">{</span> <span class="kt">NoneItemSorting</span><span class="p">()</span> <span class="p">}</span>
<span class="p">}</span>

<span class="c1">// .name Item sorting</span>

<span class="kd">struct</span> <span class="kt">NameItemSorting</span><span class="p">:</span> <span class="kt">ItemSorting</span> <span class="p">{</span>
  <span class="kd">func</span> <span class="nf">sorted</span><span class="p">(</span><span class="n">_</span> <span class="nv">items</span><span class="p">:</span> <span class="p">[</span><span class="kt">Item</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="p">[</span><span class="kt">Item</span><span class="p">]</span> <span class="p">{</span>
    <span class="n">items</span><span class="o">.</span><span class="n">sorted</span> <span class="p">{</span> <span class="nv">$0</span><span class="o">.</span><span class="n">name</span> <span class="o">&lt;</span> <span class="nv">$1</span><span class="o">.</span><span class="n">name</span> <span class="p">}</span>
  <span class="p">}</span>
<span class="p">}</span>

<span class="kd">extension</span> <span class="kt">ItemSorting</span> <span class="k">where</span> <span class="k">Self</span> <span class="o">==</span> <span class="kt">NameItemSorting</span> <span class="p">{</span>
  <span class="kd">static</span> <span class="k">var</span> <span class="nv">name</span><span class="p">:</span> <span class="kt">NameItemSorting</span> <span class="p">{</span> <span class="kt">NameItemSorting</span><span class="p">()</span> <span class="p">}</span>
<span class="p">}</span>

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

<p>This way of building it is a little more verbose but great because it lets you add to the ways that you can sort, even from outside the library.</p>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">struct</span> <span class="kt">DateItemSorting</span><span class="p">:</span> <span class="kt">ItemSorting</span> <span class="p">{</span>
  <span class="kd">func</span> <span class="nf">sort</span><span class="p">(</span><span class="n">_</span> <span class="nv">items</span><span class="p">:</span> <span class="p">[</span><span class="kt">Item</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="p">[</span><span class="kt">Item</span><span class="p">]</span> <span class="p">{</span>
    <span class="k">return</span> <span class="n">items</span><span class="o">.</span><span class="n">sorted</span> <span class="p">{</span> <span class="nv">$0</span><span class="o">.</span><span class="n">date</span> <span class="o">&lt;</span> <span class="nv">$1</span><span class="o">.</span><span class="n">date</span> <span class="p">}</span>
  <span class="p">}</span>
<span class="p">}</span>

<span class="kd">extension</span> <span class="kt">ItemSorting</span> <span class="k">where</span> <span class="k">Self</span> <span class="o">==</span> <span class="kt">DateItemSorting</span> <span class="p">{</span>
  <span class="kd">static</span> <span class="k">var</span> <span class="nv">date</span><span class="p">:</span> <span class="kt">DateItemSorting</span> <span class="p">{</span> <span class="kt">DateItemSorting</span><span class="p">()</span> <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Now, in Swift 5.5 in beyond, you can say:</p>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">items</span><span class="o">.</span><span class="nf">sorted</span><span class="p">(</span><span class="nv">using</span><span class="p">:</span> <span class="o">.</span><span class="n">date</span><span class="p">)</span>
</code></pre></div></div>

<p>Talk about clarity at the call-site. And with a nice autocomplete list of sorting options. That’s pretty neat.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[A Swift enumeration case lets you clearly spell out a mode of operation in the call site of a function. The downside is that by their nature they are “closed” and can’t be extended from outside the library they are declared. Once you define then, that’s it, they can’t be extended without another release. Recent additions to Swift 5.5 give you more tools fore creating API that is both ergonomic and extensible.]]></summary></entry><entry><title type="html">R-Style Boolean Sequences in Swift</title><link href="/2021/07/10/r-style-boolean-sequences-swift.html" rel="alternate" type="text/html" title="R-Style Boolean Sequences in Swift" /><published>2021-07-10T00:00:00+00:00</published><updated>2021-07-10T00:00:00+00:00</updated><id>/2021/07/10/r-style-boolean-sequences-swift</id><content type="html" xml:base="/2021/07/10/r-style-boolean-sequences-swift.html"><![CDATA[<p>One of the great things about the R statistical programming languages is it’s ability to operate on vectors of values. I got to thinking, wouldn’t it to be great to have this capability in Swift?  Well, Swift is nice that way.  Swift gives you a lot of flexibility to morph the language.</p>

<p>We want to be able to say something like this:</p>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">8</span><span class="p">]</span> <span class="o">&lt;</span> <span class="mi">3</span>
</code></pre></div></div>

<p>And this should return a sequence of boolean values:</p>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">[</span><span class="kc">true</span><span class="p">,</span> <span class="kc">true</span><span class="p">,</span> <span class="kc">false</span><span class="p">,</span> <span class="kc">true</span><span class="p">,</span> <span class="kc">true</span><span class="p">,</span> <span class="kc">true</span><span class="p">,</span> <span class="kc">false</span><span class="p">]</span>
</code></pre></div></div>

<h2 id="generating-sequences-of-boolean-values">Generating Sequences of Boolean Values</h2>

<p>In order create a sequence of boolean values we can add:</p>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">extension</span> <span class="kt">Sequence</span> <span class="k">where</span> <span class="kt">Element</span><span class="p">:</span> <span class="kt">Comparable</span> <span class="p">{</span>
    <span class="kd">static</span> <span class="kd">func</span> <span class="o">&lt;</span><span class="p">(</span><span class="n">_</span> <span class="nv">lhs</span><span class="p">:</span> <span class="k">Self</span><span class="p">,</span> <span class="n">_</span> <span class="nv">rhs</span><span class="p">:</span> <span class="kt">Element</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="p">[</span><span class="kt">Bool</span><span class="p">]</span> <span class="p">{</span>
        <span class="n">lhs</span><span class="o">.</span><span class="n">map</span> <span class="p">{</span> <span class="nv">$0</span> <span class="o">&lt;</span> <span class="n">rhs</span> <span class="p">}</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>This does the job, but materializes a boolean array of the same size as the source.  To avoid that allocation, we can make it lazy and return a lazy sequence like this:</p>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">extension</span> <span class="kt">Sequence</span> <span class="k">where</span> <span class="kt">Element</span><span class="p">:</span> <span class="kt">Comparable</span> <span class="p">{</span>
    <span class="kd">static</span> <span class="kd">func</span> <span class="o">&lt;</span><span class="p">(</span><span class="n">_</span> <span class="nv">lhs</span><span class="p">:</span> <span class="k">Self</span><span class="p">,</span> <span class="n">_</span> <span class="nv">rhs</span><span class="p">:</span> <span class="kt">Element</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kt">LazyMapSequence</span><span class="o">&lt;</span><span class="k">Self</span><span class="p">,</span> <span class="kt">Bool</span><span class="o">&gt;</span> <span class="p">{</span>
        <span class="n">lhs</span><span class="o">.</span><span class="kd">lazy</span><span class="o">.</span><span class="n">map</span> <span class="p">{</span> <span class="nv">$0</span> <span class="o">&lt;</span> <span class="n">rhs</span> <span class="p">}</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Although it requires some boilerplate, we can extend this to all of the other comparison operators as well.</p>

<h2 id="broadcasting-a-collection">Broadcasting a collection</h2>

<p>Another great feature of the R language and other languages like Octave, is the ability to broadcast values.  This gives you a way to deal with sequences of unequal lengths by “broadcasting” the values of a sequence again and again if necessary.</p>

<p>We can make a custom collection to do this:</p>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">struct</span> <span class="kt">Broadcasted</span><span class="o">&lt;</span><span class="kt">Base</span><span class="p">:</span> <span class="kt">Collection</span><span class="o">&gt;</span><span class="p">:</span> <span class="kt">Collection</span> <span class="k">where</span> <span class="kt">Base</span><span class="o">.</span><span class="kt">Index</span><span class="p">:</span> <span class="kt">BinaryInteger</span> <span class="p">{</span>

  <span class="kd">typealias</span> <span class="kt">Element</span> <span class="o">=</span> <span class="kt">Base</span><span class="o">.</span><span class="kt">Element</span>
  <span class="kd">typealias</span> <span class="kt">Index</span> <span class="o">=</span> <span class="kt">Base</span><span class="o">.</span><span class="kt">Index</span>

  <span class="kd">private</span> <span class="k">var</span> <span class="nv">base</span><span class="p">:</span> <span class="kt">Base</span>
  <span class="kd">private</span> <span class="k">var</span> <span class="nv">count_</span><span class="p">:</span> <span class="kt">Index</span>

  <span class="k">var</span> <span class="nv">startIndex</span><span class="p">:</span> <span class="kt">Index</span> <span class="p">{</span> <span class="n">base</span><span class="o">.</span><span class="n">startIndex</span> <span class="p">}</span>
  <span class="k">var</span> <span class="nv">endIndex</span><span class="p">:</span> <span class="kt">Index</span> <span class="p">{</span> <span class="n">count_</span> <span class="o">+</span> <span class="n">base</span><span class="o">.</span><span class="n">startIndex</span> <span class="p">}</span>

  <span class="kd">func</span> <span class="nf">index</span><span class="p">(</span><span class="n">after</span> <span class="nv">i</span><span class="p">:</span> <span class="kt">Index</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kt">Index</span> <span class="p">{</span> <span class="n">i</span> <span class="o">+</span> <span class="mi">1</span> <span class="p">}</span>

  <span class="nf">subscript</span><span class="p">(</span><span class="nv">index</span><span class="p">:</span> <span class="kt">Index</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kt">Element</span> <span class="p">{</span>
    <span class="n">base</span><span class="p">[(</span><span class="n">index</span> <span class="o">-</span> <span class="n">startIndex</span><span class="p">)</span> <span class="o">%</span> <span class="kt">Index</span><span class="p">(</span><span class="n">base</span><span class="o">.</span><span class="n">count</span><span class="p">)</span> <span class="o">+</span> <span class="n">startIndex</span><span class="p">]</span>
  <span class="p">}</span>

  <span class="nf">init</span><span class="p">(</span><span class="n">_</span> <span class="nv">base</span><span class="p">:</span> <span class="kt">Base</span><span class="p">,</span> <span class="nv">count</span><span class="p">:</span> <span class="kt">Index</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">self</span><span class="o">.</span><span class="n">base</span> <span class="o">=</span> <span class="n">base</span>
    <span class="k">self</span><span class="o">.</span><span class="n">count_</span> <span class="o">=</span> <span class="n">count</span>
  <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>It requires the collection to have an index that supports the modulo operation so it can get at the value again and again.</p>

<h2 id="selection-subscript">Selection subscript</h2>

<p>We can bring these together to let us select elements from a collection.</p>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">extension</span> <span class="kt">Collection</span> <span class="p">{</span>
    <span class="kd">subscript</span><span class="o">&lt;</span><span class="kt">C</span><span class="o">&gt;</span><span class="p">(</span><span class="nv">selection</span><span class="p">:</span> <span class="kt">C</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="p">[</span><span class="kt">Element</span><span class="p">]</span> <span class="k">where</span> <span class="kt">C</span><span class="p">:</span> <span class="kt">Collection</span><span class="p">,</span> <span class="kt">C</span><span class="o">.</span><span class="kt">Index</span><span class="p">:</span> <span class="kt">BinaryInteger</span><span class="p">,</span> <span class="kt">C</span><span class="o">.</span><span class="kt">Element</span> <span class="o">==</span> <span class="kt">Bool</span> <span class="p">{</span>
        <span class="nf">zip</span><span class="p">(</span><span class="kt">Broadcasted</span><span class="p">(</span><span class="n">selection</span><span class="p">,</span> <span class="nv">count</span><span class="p">:</span> <span class="kt">C</span><span class="o">.</span><span class="kt">Index</span><span class="p">(</span><span class="k">self</span><span class="o">.</span><span class="n">count</span><span class="p">)),</span> <span class="k">self</span><span class="p">)</span>
            <span class="o">.</span><span class="nf">filter</span><span class="p">(\</span><span class="o">.</span><span class="mi">0</span><span class="p">)</span><span class="o">.</span><span class="nf">map</span><span class="p">(\</span><span class="o">.</span><span class="mi">1</span><span class="p">)</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>This let’s us say something like this:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>// values: [Double]

values[values &lt; 3.2]
</code></pre></div></div>

<h2 id="future-improvements">Future Improvements</h2>

<p>The gist is here: <a href="https://gist.github.com/rayfix/b5f5641f0c34e88f9a178e9a57d39092">https://gist.github.com/rayfix/b5f5641f0c34e88f9a178e9a57d39092</a></p>

<p>I think it’s a nice start but there are some other things to look at. Our subscript operators allocates a new array. It might be better to return a slice into the original array. It could, for example, return a <code class="language-plaintext highlighter-rouge">DiscontinuousSlice</code> of the original collection specified as part of SE-0270. See <a href="https://github.com/apple/swift-se0270-range-set/blob/main/Sources/SE0270_RangeSet/DiscontiguousSlice.swift">https://github.com/apple/swift-se0270-range-set/blob/main/Sources/SE0270_RangeSet/DiscontiguousSlice.swift</a>
.</p>

<p>It might also be nice to create boolean operators for lists of boolean values. Left for a future post. :)</p>

<h2 id="updates">UPDATES:</h2>

<ul>
  <li>The original post’s <code class="language-plaintext highlighter-rouge">Broadcast</code> collection didn’t handle slices (non-zero start indexes correctly). Fixed.</li>
  <li><a href="https://github.com/joshuajhomann">Josh Homann</a> suggested using an <code class="language-plaintext highlighter-rouge">UnfoldSequence</code> instead of a custom <code class="language-plaintext highlighter-rouge">Broadcasted</code> collection. This removes the requirements on the index type to know about modulo arithmetic, which is nice. Although it only uses <code class="language-plaintext highlighter-rouge">Sequence</code> API, it extends <code class="language-plaintext highlighter-rouge">Collection</code> since repeated access to a <code class="language-plaintext highlighter-rouge">Sequence</code> is not defined.</li>
</ul>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">extension</span> <span class="kt">Collection</span> <span class="p">{</span>
  <span class="kd">func</span> <span class="nf">repeatForever</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="kt">UnfoldSequence</span><span class="o">&lt;</span><span class="kt">Element</span><span class="p">,</span> <span class="kt">Iterator</span><span class="o">&gt;</span> <span class="p">{</span>
    <span class="nf">sequence</span><span class="p">(</span><span class="nv">state</span><span class="p">:</span> <span class="k">self</span><span class="o">.</span><span class="nf">makeIterator</span><span class="p">())</span> <span class="p">{</span> <span class="n">iterator</span> <span class="k">in</span>
      <span class="n">iterator</span><span class="o">.</span><span class="nf">next</span><span class="p">()</span> <span class="p">??</span> <span class="p">{</span>
        <span class="n">iterator</span> <span class="o">=</span> <span class="k">self</span><span class="o">.</span><span class="nf">makeIterator</span><span class="p">()</span>
        <span class="k">return</span> <span class="n">iterator</span><span class="o">.</span><span class="nf">next</span><span class="p">()</span>
       <span class="p">}()</span>
    <span class="p">}</span>
  <span class="p">}</span>
<span class="p">}</span>

<span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">]</span><span class="o">.</span><span class="nf">repeatForever</span><span class="p">()</span><span class="o">.</span><span class="nf">prefix</span><span class="p">(</span><span class="mi">8</span><span class="p">)</span><span class="o">.</span><span class="n">forEach</span> <span class="p">{</span> <span class="nf">print</span><span class="p">(</span><span class="nv">$0</span><span class="p">)</span> <span class="p">}</span>
</code></pre></div></div>]]></content><author><name></name></author><summary type="html"><![CDATA[One of the great things about the R statistical programming languages is it’s ability to operate on vectors of values. I got to thinking, wouldn’t it to be great to have this capability in Swift? Well, Swift is nice that way. Swift gives you a lot of flexibility to morph the language.]]></summary></entry><entry><title type="html">Swift Concurrency Notes</title><link href="/2021/05/30/concurency-notes.html" rel="alternate" type="text/html" title="Swift Concurrency Notes" /><published>2021-05-30T00:00:00+00:00</published><updated>2021-05-30T00:00:00+00:00</updated><id>/2021/05/30/concurency-notes</id><content type="html" xml:base="/2021/05/30/concurency-notes.html"><![CDATA[<p>Notes reading the async/concurrency proposals to be introduced in Swift 5.5. Before you can play chess well, you must first learn the rules of chess.</p>

<h3 id="concurrency-roadmap"><a href="https://forums.swift.org/t/swift-concurrency-roadmap/41611">Concurrency Roadmap</a></h3>

<ul>
  <li>Glossary of terms</li>
</ul>

<h2 id="se-0296-asyncawait"><a href="https://github.com/apple/swift-evolution/blob/main/proposals/0296-async-await.md">SE-0296: Async/Await</a></h2>

<ul>
  <li>This proposal is about asynchrony but doesn’t talk about concurrency.</li>
  <li>Built on the idea of continuations, a generalized subroutine that can be suspended and resume.  See <a href="https://www.youtube.com/watch?v=wyAbV8AM9PM">Coroutine Representations and ABIs in LLVM</a> by John McCall.</li>
  <li>Avoids the control complexity of using callbacks and lets you use control structures found in normal synchronous code.</li>
  <li>Potential suspension points are marked explicitly. This allows you to reason about potential interleaving.</li>
  <li>Init can be async.  Deinit cannot be async.</li>
  <li>An async throwing function type can accept a non-throwing sync function.  Async throwing functions are all-mighty.</li>
  <li>Potential suspension points must be marked with await and must occur in an async context.</li>
  <li>A single await can handle multiple expressions that are potential suspension points.</li>
  <li>Normally it is “try await …” but you can reverse it with parenthesis “await (try …)”</li>
  <li>Closures can type infer async closures if you use an await in the closure. (Though the inference does not propagate to outer closures.)</li>
  <li>Overloads must differ more than just async.  Overload resolution uses the context to decide what function to call.</li>
  <li>A function that takes an async autoclosure must be async itself. (Future possible direction reasync.)</li>
  <li>An a async function cannot fulfill a sync protocol requirement.</li>
</ul>

<h3 id="main-example">Main example:</h3>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">func</span> <span class="nf">processImageData</span><span class="p">()</span> <span class="k">async</span> <span class="k">throws</span> <span class="o">-&gt;</span> <span class="kt">Image</span> <span class="p">{</span>
  <span class="k">let</span> <span class="nv">dataResource</span>  <span class="o">=</span> <span class="k">try</span> <span class="k">await</span> <span class="nf">loadWebResource</span><span class="p">(</span><span class="s">"dataprofile.txt"</span><span class="p">)</span>
  <span class="k">let</span> <span class="nv">imageResource</span> <span class="o">=</span> <span class="k">try</span> <span class="k">await</span> <span class="nf">loadWebResource</span><span class="p">(</span><span class="s">"imagedata.dat"</span><span class="p">)</span>
  <span class="k">let</span> <span class="nv">imageTmp</span>      <span class="o">=</span> <span class="k">try</span> <span class="k">await</span> <span class="nf">decodeImage</span><span class="p">(</span><span class="n">dataResource</span><span class="p">,</span> <span class="n">imageResource</span><span class="p">)</span>
  <span class="k">let</span> <span class="nv">imageResult</span>   <span class="o">=</span> <span class="k">try</span> <span class="k">await</span> <span class="nf">dewarpAndCleanupImage</span><span class="p">(</span><span class="n">imageTmp</span><span class="p">)</span>
  <span class="k">return</span> <span class="n">imageResult</span>
<span class="p">}</span>
</code></pre></div></div>

<hr />
<h2 id="se-302-sendable-and-sendable-closures"><a href="https://github.com/apple/swift-evolution/blob/main/proposals/0302-concurrent-value-and-concurrent-closures.md">SE-302: Sendable and @Sendable closures</a></h2>

<p>Sendable is used as the primary currency that gets passed between concurrency domains.  Actors can be thought of message sending domains that use mailbox messages.  Sendable data and @Sendable functions are the payloads being sent.</p>

<ul>
  <li>Sendable is a “marker protocol” (implemented specially in the compiler for now)</li>
  <li>Many ways to handle concurrency.  Swift wants to be a principled system that is sound and easy to use.</li>
  <li>Want a simple model that lasts many decades into the future.</li>
  <li>Built with value semantic types.</li>
  <li>Actors are islands of concurrency and Sendable lets you transfer across concurrency domains.</li>
  <li>Standard type such as Int and String are Sendable.</li>
  <li>Many structs and enums get Sendable conformance for free if all of their sub-types conform. (Public non-frozen structs and enums don’t get it)</li>
  <li>Actors are Sendable implicitly</li>
  <li>Use @unchecked Sendable as an escape hatch.</li>
  <li>You will get weird behavior if your type is marked Sendable but is actually not. (Much like implementing Hash requirements incorrectly.)</li>
  <li>The type @Sendable is an attribute on functions</li>
  <li>Error types must conform to Sendable</li>
</ul>

<h3 id="standard-library-types">Standard library types:</h3>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">extension</span> <span class="kt">Optional</span><span class="p">:</span> <span class="kt">Sendable</span> <span class="k">where</span> <span class="kt">Wrapped</span><span class="p">:</span> <span class="kt">Sendable</span> <span class="p">{}</span>
<span class="kd">extension</span> <span class="kt">Array</span><span class="p">:</span> <span class="kt">Sendable</span> <span class="k">where</span> <span class="kt">Element</span><span class="p">:</span> <span class="kt">Sendable</span> <span class="p">{}</span>
<span class="kd">extension</span> <span class="kt">Dictionary</span><span class="p">:</span> <span class="kt">Sendable</span>
    <span class="k">where</span> <span class="kt">Key</span><span class="p">:</span> <span class="kt">Sendable</span><span class="p">,</span> <span class="kt">Value</span><span class="p">:</span> <span class="kt">Sendable</span> <span class="p">{}</span>
</code></pre></div></div>

<ul>
  <li>ManagedBuffer must not conform to Sendable (even unsafely)</li>
  <li>The <code class="language-plaintext highlighter-rouge">Unsafe**Pointer</code> pointer family are Sendable but you have to be careful not to mutate from the parent</li>
</ul>

<hr />

<h2 id="se-0304-structured-concurrency"><a href="https://github.com/apple/swift-evolution/blob/main/proposals/0304-structured-concurrency.md">SE-0304: Structured concurrency</a></h2>]]></content><author><name></name></author><summary type="html"><![CDATA[Notes reading the async/concurrency proposals to be introduced in Swift 5.5. Before you can play chess well, you must first learn the rules of chess.]]></summary></entry><entry><title type="html">Fluent with SwiftUI</title><link href="/2021/05/18/fluent-swiftui.html" rel="alternate" type="text/html" title="Fluent with SwiftUI" /><published>2021-05-18T00:00:00+00:00</published><updated>2021-05-18T00:00:00+00:00</updated><id>/2021/05/18/fluent-swiftui</id><content type="html" xml:base="/2021/05/18/fluent-swiftui.html"><![CDATA[<p>Apple’s CoreData is a great choice for a data model on iOS and with SwiftUI. Under the hood it uses <code class="language-plaintext highlighter-rouge">SQLite</code> to handle lots of data that can’t fit into memory all at once. I have always wondered about using <code class="language-plaintext highlighter-rouge">SQLite</code> directly. It would be a little messy because <code class="language-plaintext highlighter-rouge">SQLite</code> is a C library and it would force you to use the unsafe APIs that you would certainly want to wrap. It turns out that you can pretty easily use <a href="https://docs.vapor.codes/4.0/fluent/overview/">the ORM from the Vapor project</a> in your SwiftUI project. I prepared this example by looking at test code.</p>

<p>Let’s make this simple list app:</p>

<p><img src="/images/posts/fluent-swiftui/app.png" alt="Planets app" width="350px" /></p>

<p>Start by creating a vanilla SwiftUI project and importing the fluent-sqlite-driver Swift package. <strong>File</strong> &gt; <strong>Swift Packages</strong> and add <a href="https://github.com/vapor/fluent-sqlite-driver">https://github.com/vapor/fluent-sqlite-driver</a> to the project.</p>

<p>Once that is done you can create a model type:</p>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">import</span> <span class="kt">FluentSQLiteDriver</span>

<span class="kd">final</span> <span class="kd">class</span> <span class="kt">Planet</span><span class="p">:</span> <span class="kt">Model</span> <span class="p">{</span>
  <span class="kd">static</span> <span class="k">let</span> <span class="nv">schema</span> <span class="o">=</span> <span class="s">"planets"</span>

  <span class="kd">@ID</span><span class="p">(</span><span class="nv">key</span><span class="p">:</span> <span class="o">.</span><span class="n">id</span><span class="p">)</span> <span class="k">var</span> <span class="nv">id</span><span class="p">:</span> <span class="kt">UUID</span><span class="p">?</span>
  <span class="kd">@Field</span><span class="p">(</span><span class="nv">key</span><span class="p">:</span> <span class="s">"name"</span><span class="p">)</span> <span class="k">var</span> <span class="nv">name</span><span class="p">:</span> <span class="kt">String</span>

  <span class="nf">init</span><span class="p">()</span> <span class="p">{}</span>

  <span class="nf">init</span><span class="p">(</span><span class="nv">id</span><span class="p">:</span> <span class="kt">UUID</span><span class="p">?</span> <span class="o">=</span> <span class="kc">nil</span><span class="p">,</span> <span class="nv">name</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">id</span> <span class="o">=</span> <span class="n">id</span>
    <span class="k">self</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">name</span>
  <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>You will want to create a migration to prepare the tables in the database:</p>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">struct</span> <span class="kt">CreatePlanetMigration</span><span class="p">:</span> <span class="kt">Migration</span> <span class="p">{</span>
  <span class="kd">func</span> <span class="nf">prepare</span><span class="p">(</span><span class="n">on</span> <span class="nv">database</span><span class="p">:</span> <span class="kt">Database</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kt">EventLoopFuture</span><span class="o">&lt;</span><span class="kt">Void</span><span class="o">&gt;</span> <span class="p">{</span>
    <span class="n">database</span><span class="o">.</span><span class="nf">schema</span><span class="p">(</span><span class="kt">Planet</span><span class="o">.</span><span class="n">schema</span><span class="p">)</span>
      <span class="o">.</span><span class="nf">id</span><span class="p">()</span>
      <span class="o">.</span><span class="nf">field</span><span class="p">(</span><span class="s">"name"</span><span class="p">,</span> <span class="o">.</span><span class="n">string</span><span class="p">,</span> <span class="o">.</span><span class="kd">required</span><span class="p">)</span>
      <span class="o">.</span><span class="nf">create</span><span class="p">()</span>
  <span class="p">}</span>

  <span class="kd">func</span> <span class="nf">revert</span><span class="p">(</span><span class="n">on</span> <span class="nv">database</span><span class="p">:</span> <span class="kt">Database</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kt">EventLoopFuture</span><span class="o">&lt;</span><span class="kt">Void</span><span class="o">&gt;</span> <span class="p">{</span>
    <span class="n">database</span><span class="o">.</span><span class="nf">schema</span><span class="p">(</span><span class="kt">Planet</span><span class="o">.</span><span class="n">schema</span><span class="p">)</span>
      <span class="o">.</span><span class="nf">delete</span><span class="p">()</span>
  <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>For SwiftUI, you will want to creat a view-model:</p>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">import</span> <span class="kt">SwiftUI</span>

<span class="kd">final</span> <span class="kd">class</span> <span class="kt">AppModel</span><span class="p">:</span> <span class="kt">ObservableObject</span> <span class="p">{</span>
  <span class="k">let</span> <span class="nv">databases</span><span class="p">:</span> <span class="kt">Databases</span>

  <span class="k">var</span> <span class="nv">logger</span><span class="p">:</span> <span class="kt">Logger</span> <span class="o">=</span> <span class="p">{</span>
    <span class="k">var</span> <span class="nv">logger</span> <span class="o">=</span> <span class="kt">Logger</span><span class="p">(</span><span class="nv">label</span><span class="p">:</span> <span class="s">"database.logger"</span><span class="p">)</span>
    <span class="n">logger</span><span class="o">.</span><span class="n">logLevel</span> <span class="o">=</span> <span class="o">.</span><span class="n">trace</span>
    <span class="k">return</span> <span class="n">logger</span>
  <span class="p">}()</span>

  <span class="k">var</span> <span class="nv">database</span><span class="p">:</span> <span class="kt">Database</span> <span class="p">{</span>
    <span class="k">return</span> <span class="k">self</span><span class="o">.</span><span class="n">databases</span><span class="o">.</span><span class="nf">database</span><span class="p">(</span>
      <span class="nv">logger</span><span class="p">:</span> <span class="n">logger</span><span class="p">,</span>
      <span class="nv">on</span><span class="p">:</span> <span class="k">self</span><span class="o">.</span><span class="n">databases</span><span class="o">.</span><span class="n">eventLoopGroup</span><span class="o">.</span><span class="nf">next</span><span class="p">()</span>
    <span class="p">)</span><span class="o">!</span>
  <span class="p">}</span>
  <span class="c1">// More to follow...</span>
<span class="p">}</span>
</code></pre></div></div>

<p>The databases keeps the databases available.  (Just like core data there might multiple stores.)</p>

<p>Next add this to the <code class="language-plaintext highlighter-rouge">AppModel</code>:</p>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nf">init</span><span class="p">()</span> <span class="p">{</span>
  <span class="k">let</span> <span class="nv">eventLoopGroup</span> <span class="o">=</span> <span class="kt">MultiThreadedEventLoopGroup</span><span class="p">(</span><span class="nv">numberOfThreads</span><span class="p">:</span> <span class="mi">1</span><span class="p">)</span>
  <span class="k">let</span> <span class="nv">threadPool</span> <span class="o">=</span> <span class="kt">NIOThreadPool</span><span class="p">(</span><span class="nv">numberOfThreads</span><span class="p">:</span> <span class="mi">1</span><span class="p">)</span>
  <span class="n">threadPool</span><span class="o">.</span><span class="nf">start</span><span class="p">()</span>

  <span class="n">databases</span> <span class="o">=</span> <span class="kt">Databases</span><span class="p">(</span><span class="nv">threadPool</span><span class="p">:</span> <span class="n">threadPool</span><span class="p">,</span> <span class="nv">on</span><span class="p">:</span> <span class="n">eventLoopGroup</span><span class="p">)</span>
  <span class="n">databases</span><span class="o">.</span><span class="nf">use</span><span class="p">(</span><span class="o">.</span><span class="nf">sqlite</span><span class="p">(</span><span class="o">.</span><span class="n">memory</span><span class="p">),</span> <span class="nv">as</span><span class="p">:</span> <span class="o">.</span><span class="n">sqlite</span><span class="p">)</span>
  <span class="n">databases</span><span class="o">.</span><span class="nf">default</span><span class="p">(</span><span class="nv">to</span><span class="p">:</span> <span class="o">.</span><span class="n">sqlite</span><span class="p">)</span>

  <span class="k">do</span> <span class="p">{</span>
    <span class="k">try</span> <span class="kt">CreatePlanetMigration</span><span class="p">()</span><span class="o">.</span><span class="nf">prepare</span><span class="p">(</span><span class="nv">on</span><span class="p">:</span> <span class="n">database</span><span class="p">)</span><span class="o">.</span><span class="nf">wait</span><span class="p">()</span>
    <span class="k">try</span> <span class="p">[</span><span class="s">"Mercury"</span><span class="p">,</span> <span class="s">"Venus"</span><span class="p">,</span> <span class="s">"Earth"</span><span class="p">,</span> <span class="s">"Mars"</span><span class="p">,</span> <span class="s">"Jupiter"</span><span class="p">,</span> <span class="s">"Saturn"</span><span class="p">,</span> <span class="s">"Uranus"</span><span class="p">,</span> <span class="s">"Ntune"</span><span class="p">]</span><span class="o">.</span><span class="n">forEach</span> <span class="p">{</span>
      <span class="k">let</span> <span class="nv">item</span> <span class="o">=</span> <span class="kt">Planet</span><span class="p">(</span><span class="nv">name</span><span class="p">:</span> <span class="nv">$0</span><span class="p">)</span>
      <span class="k">try</span> <span class="n">item</span><span class="o">.</span><span class="nf">save</span><span class="p">(</span><span class="nv">on</span><span class="p">:</span> <span class="n">database</span><span class="p">)</span><span class="o">.</span><span class="nf">wait</span><span class="p">()</span>
    <span class="p">}</span>
  <span class="p">}</span>
  <span class="k">catch</span> <span class="p">{</span>
    <span class="nf">print</span><span class="p">(</span><span class="s">"error </span><span class="se">\(</span><span class="n">error</span><span class="se">)</span><span class="s">"</span><span class="p">)</span>
  <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>This creates an in-memory database and adds some records to it. It performs the work syncronously on the main thread, but this should happen fast so is probably okay.  (Fluent is designed to scale to hundreds or even thousands of concurrent operations.)</p>

<blockquote>
  <p>If you want the database to use durable storage, you can use <code class="language-plaintext highlighter-rouge">.sqlite(.file(path))</code> instead of <code class="language-plaintext highlighter-rouge">.sqlite(.memory)</code></p>
</blockquote>

<p>Now let’s get the UI working. Finally add this to the <code class="language-plaintext highlighter-rouge">AppModel</code>:</p>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">var</span> <span class="nv">planets</span><span class="p">:</span> <span class="p">[</span><span class="kt">Planet</span><span class="p">]</span> <span class="p">{</span>
  <span class="k">try!</span> <span class="n">database</span><span class="o">.</span><span class="nf">query</span><span class="p">(</span><span class="kt">Planet</span><span class="o">.</span><span class="k">self</span><span class="p">)</span><span class="o">.</span><span class="nf">all</span><span class="p">()</span><span class="o">.</span><span class="nf">wait</span><span class="p">()</span>
<span class="p">}</span>
</code></pre></div></div>

<p>This just syncronously grabs the data.  Now create the SwiftUI to show it off.</p>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">@main</span>
<span class="kd">struct</span> <span class="kt">PlanetsApp</span><span class="p">:</span> <span class="kt">App</span> <span class="p">{</span>

  <span class="kd">@StateObject</span> <span class="k">var</span> <span class="nv">model</span> <span class="o">=</span> <span class="kt">AppModel</span><span class="p">()</span>

  <span class="k">var</span> <span class="nv">body</span><span class="p">:</span> <span class="kd">some</span> <span class="kt">Scene</span> <span class="p">{</span>
    <span class="kt">WindowGroup</span> <span class="p">{</span>
      <span class="kt">ContentView</span><span class="p">(</span><span class="nv">model</span><span class="p">:</span> <span class="n">model</span><span class="p">)</span>
    <span class="p">}</span>
  <span class="p">}</span>
<span class="p">}</span>

<span class="kd">struct</span> <span class="kt">ContentView</span><span class="p">:</span> <span class="kt">View</span> <span class="p">{</span>
  <span class="kd">@ObservedObject</span> <span class="k">var</span> <span class="nv">model</span><span class="p">:</span> <span class="kt">AppModel</span>
  <span class="k">var</span> <span class="nv">body</span><span class="p">:</span> <span class="kd">some</span> <span class="kt">View</span> <span class="p">{</span>
    <span class="kt">NavigationView</span> <span class="p">{</span>
      <span class="kt">List</span> <span class="p">{</span>
        <span class="kt">ForEach</span><span class="p">(</span><span class="n">model</span><span class="o">.</span><span class="n">planets</span><span class="p">,</span> <span class="nv">id</span><span class="p">:</span> <span class="p">\</span><span class="o">.</span><span class="n">id</span><span class="p">)</span> <span class="p">{</span>
          <span class="kt">Text</span><span class="p">(</span><span class="nv">$0</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
        <span class="p">}</span>
      <span class="p">}</span><span class="o">.</span><span class="nf">navigationTitle</span><span class="p">(</span><span class="s">"Planets"</span><span class="p">)</span>
    <span class="p">}</span>
  <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>You can, of course, do more fancy queries using the Fluent ORM.  For example:</p>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">var</span> <span class="nv">planets</span><span class="p">:</span> <span class="p">[</span><span class="kt">Planet</span><span class="p">]</span> <span class="p">{</span>
   <span class="k">try!</span> <span class="n">database</span><span class="o">.</span><span class="nf">query</span><span class="p">(</span><span class="kt">Planet</span><span class="o">.</span><span class="k">self</span><span class="p">)</span><span class="o">.</span><span class="nf">filter</span><span class="p">(\</span><span class="o">.</span><span class="err">$</span><span class="n">name</span> <span class="o">~~</span> <span class="s">"a"</span><span class="p">)</span><span class="o">.</span><span class="nf">all</span><span class="p">()</span><span class="o">.</span><span class="nf">wait</span><span class="p">()</span>
<span class="p">}</span>
</code></pre></div></div>

<p>This filters down to all of the planets that contain an “a”.  If you look at the console, you can see the SQL this boils down to:</p>

<pre><code class="language-none">database.logger : database-id=sqlite 
 SELECT "planets"."id" AS "planets_id", 
        "planets"."name" AS "planets_name" FROM "planets" 
 WHERE "planets"."name" LIKE ? ["%a%"]
</code></pre>

<p>That’s pretty cool. In a future post, we’ll look at how to interface with Combine better with non-blocking calls.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[Apple’s CoreData is a great choice for a data model on iOS and with SwiftUI. Under the hood it uses SQLite to handle lots of data that can’t fit into memory all at once. I have always wondered about using SQLite directly. It would be a little messy because SQLite is a C library and it would force you to use the unsafe APIs that you would certainly want to wrap. It turns out that you can pretty easily use the ORM from the Vapor project in your SwiftUI project. I prepared this example by looking at test code.]]></summary></entry><entry><title type="html">Property Wrappers</title><link href="/2021/04/26/property-wrappers.html" rel="alternate" type="text/html" title="Property Wrappers" /><published>2021-04-26T00:00:00+00:00</published><updated>2021-04-26T00:00:00+00:00</updated><id>/2021/04/26/property-wrappers</id><content type="html" xml:base="/2021/04/26/property-wrappers.html"><![CDATA[<p>Swift 5.4 is now released and includes language improvements and tooling improvements. Paul Hudson, as usual, has a great summary of what is new hosted at <a href="https://www.whatsnewinswift.com/?from=5.3&amp;to=5.4">https://www.whatsnewinswift.com</a>.</p>

<p><strong>Property wrappers</strong> which which first appeared in Swift 5.1, abstract away access patterns on a type continue to improve in Swift 5.4 by allowing them to be be applied to local variables. The easiest way to see what they do is to look at the API.</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="o">&lt;</span><span class="err">#</span><span class="kt">Name</span><span class="err">#</span><span class="o">&gt;</span> <span class="p">{</span>
    <span class="kd">private</span> <span class="k">var</span> <span class="nv">value</span><span class="p">:</span> <span class="o">&lt;</span><span class="err">#</span><span class="kt">Wrapped</span><span class="err">#</span><span class="o">&gt;</span>
    <span class="k">var</span> <span class="nv">wrappedValue</span><span class="p">:</span> <span class="o">&lt;</span><span class="err">#</span><span class="kt">Wrapped</span><span class="err">#</span><span class="o">&gt;</span> <span class="p">{</span>
        <span class="k">get</span> <span class="p">{</span> <span class="n">value</span> <span class="p">}</span>
        <span class="k">set</span> <span class="p">{</span> <span class="n">value</span> <span class="o">=</span> <span class="n">newValue</span> <span class="p">}</span>
    <span class="p">}</span>
    <span class="k">var</span> <span class="nv">projectedValue</span><span class="p">:</span> <span class="o">&lt;</span><span class="err">#</span><span class="kt">Projected</span><span class="err">#</span><span class="o">&gt;</span> <span class="p">{</span>
        <span class="k">get</span> <span class="p">{</span> <span class="n">value</span> <span class="p">}</span>
        <span class="k">set</span> <span class="p">{</span> <span class="n">value</span> <span class="o">=</span> <span class="n">newValue</span> <span class="p">}</span>
    <span class="p">}</span>
    <span class="nf">init</span><span class="p">(</span><span class="nv">wrappedValue</span><span class="p">:</span> <span class="o">&lt;</span><span class="err">#</span><span class="kt">Wrapped</span><span class="err">#</span><span class="o">&gt;</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">value</span> <span class="o">=</span> <span class="n">wrappedValue</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>You use this type with the <code class="language-plaintext highlighter-rouge">@</code> mark to give types the special behavior.  <code class="language-plaintext highlighter-rouge">@Behavior var velocity: Double</code>.  The <code class="language-plaintext highlighter-rouge">wrappedValue</code> is used where you use <code class="language-plaintext highlighter-rouge">velocity</code> and you can get at the projectedValue with <code class="language-plaintext highlighter-rouge">$velocity</code>.</p>

<p>The only real requirement is that you implement <code class="language-plaintext highlighter-rouge">wrappedValue</code>. It is not required to have a projected value.  For example:</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">Clamping</span><span class="o">&lt;</span><span class="kt">T</span><span class="p">:</span> <span class="kt">Comparable</span><span class="o">&gt;</span> <span class="p">{</span>
  <span class="nf">init</span><span class="p">(</span><span class="nv">wrappedValue</span><span class="p">:</span> <span class="kt">T</span><span class="p">,</span> <span class="nv">range</span><span class="p">:</span> <span class="kt">ClosedRange</span><span class="o">&lt;</span><span class="kt">T</span><span class="o">&gt;</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">self</span><span class="o">.</span><span class="n">value</span> <span class="o">=</span> <span class="n">range</span><span class="o">.</span><span class="nf">clamp</span><span class="p">(</span><span class="n">wrappedValue</span><span class="p">)</span>
    <span class="k">self</span><span class="o">.</span><span class="n">range</span> <span class="o">=</span> <span class="n">range</span>
  <span class="p">}</span>

  <span class="kd">private</span> <span class="k">var</span> <span class="nv">value</span><span class="p">:</span> <span class="kt">T</span>
  <span class="k">let</span> <span class="nv">range</span><span class="p">:</span> <span class="kt">ClosedRange</span><span class="o">&lt;</span><span class="kt">T</span><span class="o">&gt;</span>
  <span class="k">var</span> <span class="nv">wrappedValue</span><span class="p">:</span> <span class="kt">T</span> <span class="p">{</span>
    <span class="k">get</span> <span class="p">{</span> <span class="n">value</span> <span class="p">}</span>
    <span class="k">set</span> <span class="p">{</span> <span class="n">value</span> <span class="o">=</span> <span class="n">range</span><span class="o">.</span><span class="nf">clamp</span><span class="p">(</span><span class="n">newValue</span><span class="p">)</span> <span class="p">}</span>
  <span class="p">}</span>
<span class="p">}</span>

<span class="kd">extension</span> <span class="kt">ClosedRange</span> <span class="p">{</span>
  <span class="kd">func</span> <span class="nf">clamp</span><span class="p">(</span><span class="n">_</span> <span class="nv">value</span><span class="p">:</span> <span class="kt">Bound</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kt">Bound</span> <span class="p">{</span>
    <span class="kt">Swift</span><span class="o">.</span><span class="nf">min</span><span class="p">(</span><span class="kt">Swift</span><span class="o">.</span><span class="nf">max</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="k">self</span><span class="o">.</span><span class="n">lowerBound</span><span class="p">),</span> <span class="k">self</span><span class="o">.</span><span class="n">upperBound</span><span class="p">)</span>
  <span class="p">}</span>
<span class="p">}</span>

<span class="kd">class</span> <span class="kt">Spaceship</span> <span class="p">{</span>
  <span class="kd">@Clamping</span><span class="p">(</span><span class="nv">range</span><span class="p">:</span> <span class="mi">1</span><span class="o">...</span><span class="mi">100</span><span class="p">)</span> <span class="k">var</span> <span class="nv">velocity</span><span class="p">:</span> <span class="kt">Double</span> <span class="o">=</span> <span class="mi">10</span>
<span class="p">}</span>

<span class="k">let</span> <span class="nv">t</span> <span class="o">=</span> <span class="kt">Spaceship</span><span class="p">()</span>
<span class="n">t</span><span class="o">.</span><span class="n">velocity</span>           <span class="c1">// 10</span>
<span class="n">t</span><span class="o">.</span><span class="n">velocity</span> <span class="o">=</span> <span class="mi">25</span>
<span class="n">t</span><span class="o">.</span><span class="n">velocity</span>           <span class="c1">// 25</span>
<span class="n">t</span><span class="o">.</span><span class="n">velocity</span> <span class="o">=</span> <span class="mi">200</span>
<span class="n">t</span><span class="o">.</span><span class="n">velocity</span>           <span class="c1">// 100</span>
</code></pre></div></div>

<p>This doesn’t have a projected value.  You might add one that keeps the original value passed in. With that design way you could project to the unclamped original, which might be useful.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[Swift 5.4 is now released and includes language improvements and tooling improvements. Paul Hudson, as usual, has a great summary of what is new hosted at https://www.whatsnewinswift.com.]]></summary></entry><entry><title type="html">SwiftUI with Argument Parsing</title><link href="/2021/04/24/swiftui-argument-parser.html" rel="alternate" type="text/html" title="SwiftUI with Argument Parsing" /><published>2021-04-24T00:00:00+00:00</published><updated>2021-04-24T00:00:00+00:00</updated><id>/2021/04/24/swiftui-argument-parser</id><content type="html" xml:base="/2021/04/24/swiftui-argument-parser.html"><![CDATA[<p>It’s easy to apply the Swift Argument Parser in the last post to a SwiftUI app. This capability can be helpful in testing by allowing you to bootstrap data into your app. In this post, you will take a minimal SwiftUI app and add argument parsing to it. Here is the app greeting that shows a greeting message to the user.</p>

<p><img src="/images/posts/swiftui-argument-parser/app.png" alt="Sample app" width="700px" /></p>

<p>The entire code for this app is here:</p>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">import</span> <span class="kt">SwiftUI</span>

<span class="kd">final</span> <span class="kd">class</span> <span class="kt">GreetingViewModel</span><span class="p">:</span> <span class="kt">ObservableObject</span> <span class="p">{</span>
  <span class="kd">@Published</span> <span class="k">var</span> <span class="nv">name</span><span class="p">:</span> <span class="kt">String</span> <span class="o">=</span> <span class="s">"World 🌏"</span>
<span class="p">}</span>

<span class="kd">struct</span> <span class="kt">GreetingView</span><span class="p">:</span> <span class="kt">View</span> <span class="p">{</span>
  <span class="kd">@ObservedObject</span> <span class="k">var</span> <span class="nv">model</span><span class="p">:</span> <span class="kt">GreetingViewModel</span>
  <span class="k">var</span> <span class="nv">body</span><span class="p">:</span> <span class="kd">some</span> <span class="kt">View</span> <span class="p">{</span>
    <span class="kt">Text</span><span class="p">(</span><span class="s">"Hello, </span><span class="se">\(</span><span class="n">model</span><span class="o">.</span><span class="n">name</span><span class="se">)</span><span class="s">!"</span><span class="p">)</span><span class="o">.</span><span class="nf">padding</span><span class="p">()</span>
  <span class="p">}</span>
<span class="p">}</span>

<span class="kd">@main</span>
<span class="kd">struct</span> <span class="kt">GreetingApp</span><span class="p">:</span> <span class="kt">App</span> <span class="p">{</span>
  <span class="kd">@StateObject</span> <span class="k">var</span> <span class="nv">model</span> <span class="o">=</span> <span class="kt">GreetingViewModel</span><span class="p">()</span>
  <span class="k">var</span> <span class="nv">body</span><span class="p">:</span> <span class="kd">some</span> <span class="kt">Scene</span> <span class="p">{</span>
    <span class="kt">WindowGroup</span> <span class="p">{</span>
      <span class="kt">GreetingView</span><span class="p">(</span><span class="nv">model</span><span class="p">:</span> <span class="n">model</span><span class="p">)</span>
    <span class="p">}</span>
  <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>The <code class="language-plaintext highlighter-rouge">GreetingViewModel</code> holds the app’s business logic. A real app would have a more involved view model, obviously. Keep it simple for this example.</p>

<h2 id="adding-in-argumentparser">Adding in ArgumentParser</h2>

<p>Next, add the Swift Argument Parser Swift package with <strong>File &gt; Swift Packages &gt; Add Package Dependency…</strong> Enter in https://github.com/apple/swift-argument-parser and click through until added and finished.</p>

<p>Back in the source file, add this to the top of the file:</p>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">import</span> <span class="kt">ArgumentParser</span>

<span class="kd">struct</span> <span class="kt">GreetingArguments</span><span class="p">:</span> <span class="kt">ParsableArguments</span> <span class="p">{</span>
  <span class="kd">@Option</span><span class="p">(</span><span class="nv">help</span><span class="p">:</span> <span class="s">"Override the greeting name"</span><span class="p">)</span>
  <span class="k">var</span> <span class="nv">name</span><span class="p">:</span> <span class="kt">String</span><span class="p">?</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Notice that since this isn’t a command. You create a type conforming to <code class="language-plaintext highlighter-rouge">ParsableArguments</code>, so you don’t need to implement a <code class="language-plaintext highlighter-rouge">run</code> method.</p>

<h2 id="create-a-helper-for-updating-parameters">Create a helper for updating parameters</h2>

<p>Now add this:</p>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">extension</span> <span class="kt">GreetingArguments</span> <span class="p">{</span>
  <span class="kd">func</span> <span class="nf">update</span><span class="p">(</span><span class="n">_</span> <span class="nv">viewModel</span><span class="p">:</span> <span class="kt">GreetingViewModel</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">if</span> <span class="k">let</span> <span class="nv">name</span> <span class="o">=</span> <span class="n">name</span> <span class="p">{</span>
      <span class="n">viewModel</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">name</span>
    <span class="p">}</span>
  <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>This <code class="language-plaintext highlighter-rouge">update</code> isn’t part of the protocol; it is just a convenient method that clarifies the type for updating <code class="language-plaintext highlighter-rouge">GreetingViewModel.</code></p>

<h2 id="using-greetingarguments">Using GreetingArguments</h2>

<p>Next change how the source of truth is created with the below code:</p>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">@StateObject</span> <span class="k">var</span> <span class="nv">model</span><span class="p">:</span> <span class="kt">GreetingViewModel</span> <span class="o">=</span> <span class="p">{</span>
  <span class="k">let</span> <span class="nv">model</span> <span class="o">=</span> <span class="kt">GreetingViewModel</span><span class="p">()</span>
  <span class="k">do</span> <span class="p">{</span>
    <span class="k">let</span> <span class="nv">args</span> <span class="o">=</span> <span class="k">try</span> <span class="kt">GreetingArguments</span><span class="o">.</span><span class="nf">parse</span><span class="p">()</span>
    <span class="n">args</span><span class="o">.</span><span class="nf">update</span><span class="p">(</span><span class="n">model</span><span class="p">)</span>
  <span class="p">}</span>
  <span class="k">catch</span> <span class="p">{</span>
    <span class="nf">print</span><span class="p">(</span><span class="s">"Error: Could not parse arguments"</span><span class="p">)</span>
    <span class="nf">print</span><span class="p">(</span><span class="kt">CommandLine</span><span class="o">.</span><span class="n">arguments</span><span class="o">.</span><span class="nf">dropFirst</span><span class="p">()</span><span class="o">.</span><span class="nf">joined</span><span class="p">(</span><span class="nv">separator</span><span class="p">:</span> <span class="s">" "</span><span class="p">))</span>
    <span class="nf">print</span><span class="p">(</span><span class="kt">GreetingArguments</span><span class="o">.</span><span class="nf">helpMessage</span><span class="p">())</span>
  <span class="p">}</span>
  <span class="k">return</span> <span class="n">model</span>
<span class="p">}()</span>
</code></pre></div></div>

<p>This code makes a closure and calls it to produce a <code class="language-plaintext highlighter-rouge">GreetingViewModel</code> type. You call <code class="language-plaintext highlighter-rouge">parse</code>  and update the model.</p>

<p>If you run the app now, you won’t see any difference.</p>

<p><img src="/images/posts/swiftui-argument-parser/app.png" alt="Sample app still looks the same" width="700px" /></p>

<p>There’s no difference because you haven’t passed an option. To do that, open the scheme with <strong>Command &lt;</strong> and enter it like so:</p>

<p><img src="/images/posts/swiftui-argument-parser/add-arguments.png" alt="Adding an argument with Xcode" width="700px" /></p>

<p>When you run the app now you will get this:</p>

<p><img src="/images/posts/swiftui-argument-parser/app-with-arg.png" alt="Sample app with argument in effect" width="700px" /></p>

<h2 id="error-handling">Error handling</h2>

<p>If you enter invalid arguments, the app will still run but will print messages to the console.</p>

<pre><code class="language-none">Error: Could not parse arguments
Kitty
USAGE: greeting_arguments [--name &lt;name&gt;]

OPTIONS:
  --name &lt;name&gt;           Override the greeting name 
  -h, --help              Show help information.
</code></pre>

<p>Here, you didn’t put in <code class="language-plaintext highlighter-rouge">--name</code>, so it failed to parse. It is a soft error and the app launches, but you could easily make it trap as well.</p>

<h2 id="final-thoughts">Final thoughts</h2>

<p>Adding a command line to your app is a great way to improve development speed by generating fake data to test things out. The example here is trivial, but easy to imagine how you could scale it up to a larger project.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[It’s easy to apply the Swift Argument Parser in the last post to a SwiftUI app. This capability can be helpful in testing by allowing you to bootstrap data into your app. In this post, you will take a minimal SwiftUI app and add argument parsing to it. Here is the app greeting that shows a greeting message to the user.]]></summary></entry><entry><title type="html">Command Line Tools in Swift</title><link href="/2021/04/21/argument_parsing.html" rel="alternate" type="text/html" title="Command Line Tools in Swift" /><published>2021-04-21T00:00:00+00:00</published><updated>2021-04-21T00:00:00+00:00</updated><id>/2021/04/21/argument_parsing</id><content type="html" xml:base="/2021/04/21/argument_parsing.html"><![CDATA[<p>Command-line interfaces (CLIs) provide a robust, textual way to communicate with your programs. Swift, as a general-purpose computing platform, lets you build these kinds of tools efficiently and elegantly. In this post, you’ll have a look at the Swift package <a href="https://github.com/apple/swift-argument-parser">Argument Parser</a>, which handles all the boilerplate of creating a full-featured, command-line interface.</p>

<h2 id="building-m25">Building m25</h2>

<p>To guide your journey, you’ll build a command-line tool to help practice multiplication called <strong>m25</strong>. (Mental math books suggest that one memorize the 25x25 table if you want to go fast.)</p>

<p>Open Xcode and create a macOS command-line tool called <strong>m25</strong>. The convention for command-line tools is to use lower-case names.</p>

<p><img src="/images/posts/argument_parsing/CommandLine.png" alt="Create a command-line tool" width="700px" /></p>

<p>Start with an abstraction for questions and answers. Open the file <strong>main.swift</strong> and replace it with this:</p>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">import</span> <span class="kt">Foundation</span>

<span class="kd">struct</span> <span class="kt">Multiplication</span> <span class="p">{</span>
  <span class="k">var</span> <span class="nv">a</span><span class="p">,</span> <span class="nv">b</span><span class="p">:</span> <span class="kt">Int</span>
  <span class="k">var</span> <span class="nv">question</span><span class="p">:</span> <span class="kt">String</span> <span class="p">{</span> <span class="s">"</span><span class="se">\(</span><span class="n">a</span><span class="se">)</span><span class="s">·</span><span class="se">\(</span><span class="n">b</span><span class="se">)</span><span class="s">"</span> <span class="p">}</span>
  <span class="k">var</span> <span class="nv">answer</span><span class="p">:</span> <span class="kt">String</span> <span class="p">{</span> <span class="s">"</span><span class="se">\(</span><span class="n">a</span><span class="o">*</span><span class="n">b</span><span class="se">)</span><span class="s">"</span> <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Using this abstraction, you can generate a list of shuffled multiplications:</p>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">let</span> <span class="nv">numberToStudy</span> <span class="o">=</span> <span class="mi">12</span>
<span class="k">let</span> <span class="nv">multiplications</span> <span class="o">=</span> <span class="p">(</span><span class="mi">2</span><span class="o">...</span><span class="mi">25</span><span class="p">)</span><span class="o">.</span><span class="n">map</span> <span class="p">{</span>
  <span class="kt">Multiplication</span><span class="p">(</span><span class="nv">a</span><span class="p">:</span> <span class="n">numberToStudy</span><span class="p">,</span> <span class="nv">b</span><span class="p">:</span> <span class="nv">$0</span><span class="p">)</span>
<span class="p">}</span><span class="o">.</span><span class="nf">shuffled</span><span class="p">()</span>
</code></pre></div></div>

<p>This code maps the numbers two through twenty-five to multiplication questions. Now you have a random list of <code class="language-plaintext highlighter-rouge">multiplications</code>. Next, add this:</p>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">var</span> <span class="nv">correctResponseCount</span> <span class="o">=</span> <span class="mi">0</span>

<span class="k">for</span> <span class="p">(</span><span class="n">offset</span><span class="p">,</span> <span class="n">mult</span><span class="p">)</span> <span class="k">in</span> <span class="n">multiplications</span><span class="o">.</span><span class="nf">enumerated</span><span class="p">()</span> <span class="p">{</span>

    <span class="nf">print</span><span class="p">(</span><span class="s">"Question </span><span class="se">\(</span><span class="n">offset</span><span class="o">+</span><span class="mi">1</span><span class="se">)</span><span class="s"> of </span><span class="se">\(</span><span class="n">multiplications</span><span class="o">.</span><span class="n">count</span><span class="se">)</span><span class="s">"</span><span class="p">)</span>
    <span class="nf">print</span><span class="p">(</span><span class="n">mult</span><span class="o">.</span><span class="n">question</span><span class="p">)</span>

    <span class="k">let</span> <span class="nv">response</span> <span class="o">=</span> <span class="nf">readLine</span><span class="p">(</span><span class="nv">strippingNewline</span><span class="p">:</span> <span class="kc">true</span><span class="p">)?</span>
        <span class="o">.</span><span class="nf">trimmingCharacters</span><span class="p">(</span><span class="nv">in</span><span class="p">:</span> <span class="o">.</span><span class="n">whitespaces</span><span class="p">)</span>

    <span class="k">if</span> <span class="n">response</span> <span class="o">==</span> <span class="n">mult</span><span class="o">.</span><span class="n">answer</span> <span class="p">{</span>
      <span class="nf">print</span><span class="p">(</span><span class="s">"⭐️ Correct"</span><span class="p">)</span>
      <span class="n">correctResponseCount</span> <span class="o">+=</span> <span class="mi">1</span>
    <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
        <span class="nf">print</span><span class="p">(</span><span class="s">"❌ Incorrect </span><span class="se">\(</span><span class="n">mult</span><span class="o">.</span><span class="n">question</span><span class="se">)</span><span class="s"> = </span><span class="se">\(</span><span class="n">mult</span><span class="o">.</span><span class="n">answer</span><span class="se">)</span><span class="s">"</span><span class="p">)</span>
    <span class="p">}</span>
<span class="p">}</span>

<span class="k">let</span> <span class="nv">performance</span> <span class="o">=</span> <span class="kt">Int</span><span class="p">(</span><span class="kt">Double</span><span class="p">(</span><span class="n">correctResponseCount</span><span class="p">)</span> <span class="o">/</span> 
                      <span class="kt">Double</span><span class="p">(</span><span class="n">multiplications</span><span class="o">.</span><span class="n">count</span><span class="p">)</span> <span class="o">*</span> <span class="mi">100</span><span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="s">"🏁🏁🏁 Finished </span><span class="se">\(</span><span class="n">performance</span><span class="se">)</span><span class="s">% 🏁🏁🏁"</span><span class="p">)</span>
</code></pre></div></div>

<p>This code enumerates through the problems, prints a question, takes in a response, removing whitespace and grades the results. After you finish, it shows the percentage you got correct.</p>

<p>Run the app and look in the debug console window type in some answers. You may need to hit Command-Shift-Y to toggle the console area.</p>

<p><img src="/images/posts/argument_parsing/12.png" alt="Playing 12 in console" width="700px" /></p>

<p>This CLI is already useful… at least for studying 12. What if you want to study a different number?</p>

<h2 id="the-hard-way">The hard way</h2>

<p>To parse arguments yourself, you can use the <code class="language-plaintext highlighter-rouge">CommandLine</code> to get arguments from the command line. Use this to get the number to study by replacing <code class="language-plaintext highlighter-rouge">let numberToStudy = 12</code> with this:</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">numberToStudy</span> <span class="o">=</span> <span class="kt">CommandLine</span><span class="o">.</span><span class="n">arguments</span><span class="o">.</span><span class="nf">dropFirst</span><span class="p">()</span>
        <span class="o">.</span><span class="n">first</span><span class="o">.</span><span class="nf">flatMap</span><span class="p">(</span><span class="kt">Int</span><span class="o">.</span><span class="kd">init</span><span class="p">)</span> <span class="k">else</span> <span class="p">{</span>
  <span class="nf">print</span><span class="p">(</span><span class="s">"Need a number to study"</span><span class="p">)</span>
  <span class="nf">exit</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span>
<span class="p">}</span>
</code></pre></div></div>

<p>The above code gets the second argument and tries to parse it as an <code class="language-plaintext highlighter-rouge">Int</code>. If it fails, it prints a message and exits. When you run the program, you’ll see this:</p>

<pre><code class="language-none">Need a number to study
Program ended with exit code: 255
</code></pre>

<p>Fortunately, Xcode allows you to specify arguments to a starting app or application easily. Open the scheme with <strong>Command &lt;</strong> switch to <strong>Arguments</strong> tab and add 15 to <strong>Arguments Passed On Launch</strong>.</p>

<p><img src="/images/posts/argument_parsing/Argument15.png" alt="Set arguments in Xcode" width="700px" /></p>

<p>Now when you run the program, you will again be able to answer questions, but this time for 15.</p>

<h2 id="adding-argumentparser">Adding ArgumentParser</h2>

<p>You probably want to add more features to the application, and while it is possible using the <code class="language-plaintext highlighter-rouge">CommandLine</code> object directly, you are better off leveraging Argument Parser.</p>

<p>To add the Swift Package, go to Xcode <strong>File</strong> : <strong>Swift Packages</strong> : <strong>Add Package Dependency</strong>. Then add https://github.com/apple/swift-argument-parser to the search field and press <strong>Next</strong>.  You will see something like this:</p>

<p><img src="/images/posts/argument_parsing/SwiftPM.png" alt="SwiftPM in Xcode" width="700px" /></p>

<p>Press <strong>Next</strong> again.  Make sure your target <strong>m25</strong> has <strong>ArgumentParser</strong> checked and click <strong>Finish</strong>.</p>

<h2 id="using-argumentparser">Using ArgumentParser</h2>

<p>You can now convert your <strong>main.swift</strong> over to using ArgumentParser. First, at the top of the file, add this:</p>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">import</span> <span class="kt">ArgumentParser</span>
</code></pre></div></div>

<p>Next, you will create a type called <code class="language-plaintext highlighter-rouge">RunQuiz</code> that conforms to the <code class="language-plaintext highlighter-rouge">ParsableCommand</code> protocol. It has a run method that will do the work you did previously. Remove <code class="language-plaintext highlighter-rouge">numberToStudy</code> and add it as a property to <code class="language-plaintext highlighter-rouge">RunQuiz</code>.  It will look like so:</p>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">import</span> <span class="kt">ArgumentParser</span>
<span class="kd">import</span> <span class="kt">Foundation</span>

<span class="kd">struct</span> <span class="kt">Multiplication</span> <span class="p">{</span>
  <span class="k">var</span> <span class="nv">a</span><span class="p">,</span> <span class="nv">b</span><span class="p">:</span> <span class="kt">Int</span>
  <span class="k">var</span> <span class="nv">question</span><span class="p">:</span> <span class="kt">String</span> <span class="p">{</span> <span class="s">"</span><span class="se">\(</span><span class="n">a</span><span class="se">)</span><span class="s">·</span><span class="se">\(</span><span class="n">b</span><span class="se">)</span><span class="s">"</span> <span class="p">}</span>
  <span class="k">var</span> <span class="nv">answer</span><span class="p">:</span> <span class="kt">String</span> <span class="p">{</span> <span class="s">"</span><span class="se">\(</span><span class="n">a</span><span class="o">*</span><span class="n">b</span><span class="se">)</span><span class="s">"</span> <span class="p">}</span>
<span class="p">}</span>

<span class="kd">struct</span> <span class="kt">RunQuiz</span><span class="p">:</span> <span class="kt">ParsableCommand</span> <span class="p">{</span>
  <span class="kd">@Argument</span>
  <span class="k">var</span> <span class="nv">numberToStudy</span><span class="p">:</span> <span class="kt">Int</span>

  <span class="k">mutating</span> <span class="kd">func</span> <span class="nf">run</span><span class="p">()</span> <span class="k">throws</span> <span class="p">{</span>
    <span class="k">let</span> <span class="nv">multiplications</span> <span class="o">=</span> <span class="p">(</span><span class="mi">2</span><span class="o">...</span><span class="mi">25</span><span class="p">)</span><span class="o">.</span><span class="n">map</span> <span class="p">{</span>
      <span class="kt">Multiplication</span><span class="p">(</span><span class="nv">a</span><span class="p">:</span> <span class="n">numberToStudy</span><span class="p">,</span> <span class="nv">b</span><span class="p">:</span> <span class="nv">$0</span><span class="p">)</span>
    <span class="p">}</span><span class="o">.</span><span class="nf">shuffled</span><span class="p">()</span>

    <span class="k">var</span> <span class="nv">correctResponseCount</span> <span class="o">=</span> <span class="mi">0</span>
    <span class="k">for</span> <span class="p">(</span><span class="n">offset</span><span class="p">,</span> <span class="n">mult</span><span class="p">)</span> <span class="k">in</span> <span class="n">multiplications</span><span class="o">.</span><span class="nf">enumerated</span><span class="p">()</span> <span class="p">{</span>
      <span class="nf">print</span><span class="p">(</span><span class="s">"Question </span><span class="se">\(</span><span class="n">offset</span><span class="o">+</span><span class="mi">1</span><span class="se">)</span><span class="s"> of </span><span class="se">\(</span><span class="n">multiplications</span><span class="o">.</span><span class="n">count</span><span class="se">)</span><span class="s">"</span><span class="p">)</span>
      <span class="nf">print</span><span class="p">(</span><span class="n">mult</span><span class="o">.</span><span class="n">question</span><span class="p">)</span>
      <span class="k">let</span> <span class="nv">response</span> <span class="o">=</span> <span class="nf">readLine</span><span class="p">(</span><span class="nv">strippingNewline</span><span class="p">:</span> <span class="kc">true</span><span class="p">)?</span>
        <span class="o">.</span><span class="nf">trimmingCharacters</span><span class="p">(</span><span class="nv">in</span><span class="p">:</span> <span class="o">.</span><span class="n">whitespaces</span><span class="p">)</span>

      <span class="k">if</span> <span class="n">response</span> <span class="o">==</span> <span class="n">mult</span><span class="o">.</span><span class="n">answer</span> <span class="p">{</span>
        <span class="nf">print</span><span class="p">(</span><span class="s">"⭐️ Correct"</span><span class="p">)</span>
        <span class="n">correctResponseCount</span> <span class="o">+=</span> <span class="mi">1</span>
      <span class="p">}</span>
      <span class="k">else</span> <span class="p">{</span>
        <span class="nf">print</span><span class="p">(</span><span class="s">"❌ Incorrect </span><span class="se">\(</span><span class="n">mult</span><span class="o">.</span><span class="n">question</span><span class="se">)</span><span class="s"> = </span><span class="se">\(</span><span class="n">mult</span><span class="o">.</span><span class="n">answer</span><span class="se">)</span><span class="s">"</span><span class="p">)</span>
      <span class="p">}</span>
    <span class="p">}</span>

    <span class="k">let</span> <span class="nv">performance</span> <span class="o">=</span> <span class="kt">Int</span><span class="p">(</span><span class="kt">Double</span><span class="p">(</span><span class="n">correctResponseCount</span><span class="p">)</span> <span class="o">/</span> 
                          <span class="kt">Double</span><span class="p">(</span><span class="n">multiplications</span><span class="o">.</span><span class="n">count</span><span class="p">)</span> <span class="o">*</span> <span class="mi">100</span><span class="p">)</span>
    <span class="nf">print</span><span class="p">(</span><span class="s">"🏁🏁🏁 Finished </span><span class="se">\(</span><span class="n">performance</span><span class="se">)</span><span class="s">% 🏁🏁🏁"</span><span class="p">)</span>
  <span class="p">}</span>
<span class="p">}</span>

<span class="kt">RunQuiz</span><span class="o">.</span><span class="nf">main</span><span class="p">()</span>
</code></pre></div></div>

<p>Your variable, <code class="language-plaintext highlighter-rouge">numberToStudy</code>, is now modified with the property wrapper <code class="language-plaintext highlighter-rouge">@Argument</code>, which tells the parser that this is a <strong>required</strong> argument.  You call <code class="language-plaintext highlighter-rouge">RunQuiz.main()</code>.  This statement starts the argument parser going, which will find <code class="language-plaintext highlighter-rouge">numberToStudy</code> and call the <code class="language-plaintext highlighter-rouge">run</code> method for you.</p>

<p>The behavior works the same as before but with a few improvements. Go back to the scheme (with Command &lt;) and stop the argument 15 from being passed in by unchecking the box. You will get this output when you run the program:</p>

<pre><code class="language-none">Error: Missing expected argument '&lt;number-to-study&gt;'

USAGE: run-quiz &lt;number-to-study&gt;

ARGUMENTS:
  &lt;number-to-study&gt;

OPTIONS:
  -h, --help              Show help information.

Program ended with exit code: 64
</code></pre>

<p>That’s pretty great. Automatic error checking and reporting and some help too.</p>

<h2 id="add-help">Add help</h2>

<p>You can improve the help text of <strong>number-to-study</strong> by specifying help in your <code class="language-plaintext highlighter-rouge">@Argument</code>.  Change the property to this:</p>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">@Argument</span><span class="p">(</span><span class="nv">help</span><span class="p">:</span> <span class="s">"Specify the number to study."</span><span class="p">)</span>
<span class="k">var</span> <span class="nv">numberToStudy</span><span class="p">:</span> <span class="kt">Int</span>
</code></pre></div></div>

<p>Rerun it to see the improved help.</p>

<h2 id="change-the-type">Change the type</h2>

<p>One of the advantages of using the argument parser is that it uses the type of the property to direct its processing. To see how you can use this to great effect, change <code class="language-plaintext highlighter-rouge">numberToStudy: Int</code> to <code class="language-plaintext highlighter-rouge">numbersToStudy: [Int]</code> like so:</p>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">@Argument</span><span class="p">(</span><span class="nv">help</span><span class="p">:</span> <span class="s">"Specify the numbers to study."</span><span class="p">)</span>
<span class="k">var</span> <span class="nv">numbersToStudy</span><span class="p">:</span> <span class="p">[</span><span class="kt">Int</span><span class="p">]</span>
</code></pre></div></div>

<p>Now that it is an array, you need to change how the multiplications are generated. Change the code to this:</p>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">let</span> <span class="nv">multiplications</span> <span class="o">=</span> <span class="n">numbersToStudy</span><span class="o">.</span><span class="n">flatMap</span> <span class="p">{</span> <span class="n">a</span> <span class="nf">in</span>
  <span class="p">(</span><span class="mi">2</span><span class="o">...</span><span class="mi">25</span><span class="p">)</span><span class="o">.</span><span class="n">map</span> <span class="p">{</span> <span class="n">b</span> <span class="k">in</span>
    <span class="kt">Multiplication</span><span class="p">(</span><span class="nv">a</span><span class="p">:</span> <span class="n">a</span><span class="p">,</span> <span class="nv">b</span><span class="p">:</span> <span class="n">b</span><span class="p">)</span>
  <span class="p">}</span>
<span class="p">}</span><span class="o">.</span><span class="nf">shuffled</span><span class="p">()</span>
</code></pre></div></div>

<p>Open the scheme and change the argument to 10 11. Just like that, you can practice a batch of numbers.</p>

<h2 id="add-an-option">Add an option</h2>

<p><code class="language-plaintext highlighter-rouge">@Argument</code> says that a property is required for the command to run. An option is, well, optional. Suppose you want to limit the number of questions that appear. To do that, first create a limit property like this:</p>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code>  <span class="kd">@Option</span><span class="p">(</span><span class="nv">name</span><span class="p">:</span> <span class="o">.</span><span class="n">shortAndLong</span><span class="p">,</span> <span class="nv">help</span><span class="p">:</span> <span class="s">"Limit the number of questions."</span><span class="p">)</span>
  <span class="k">var</span> <span class="nv">limit</span><span class="p">:</span> <span class="kt">Int</span><span class="p">?</span>
</code></pre></div></div>

<p>If <code class="language-plaintext highlighter-rouge">limit</code> is <code class="language-plaintext highlighter-rouge">nil</code> there is no limit. If it is non-nil, it limits the questions to that number. Change your code to respect this property:</p>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">let</span> <span class="nv">all</span> <span class="o">=</span> <span class="n">numbersToStudy</span><span class="o">.</span><span class="n">flatMap</span> <span class="p">{</span> <span class="n">a</span> <span class="nf">in</span>
  <span class="p">(</span><span class="mi">2</span><span class="o">...</span><span class="mi">25</span><span class="p">)</span><span class="o">.</span><span class="n">map</span> <span class="p">{</span> <span class="n">b</span> <span class="k">in</span>
    <span class="kt">Multiplication</span><span class="p">(</span><span class="nv">a</span><span class="p">:</span> <span class="n">a</span><span class="p">,</span> <span class="nv">b</span><span class="p">:</span> <span class="n">b</span><span class="p">)</span>
  <span class="p">}</span>
<span class="p">}</span><span class="o">.</span><span class="nf">shuffled</span><span class="p">()</span>
<span class="k">let</span> <span class="nv">multiplications</span> <span class="o">=</span> <span class="n">limit</span><span class="o">.</span><span class="n">map</span> <span class="p">{</span> <span class="kt">Array</span><span class="p">(</span><span class="n">all</span><span class="o">.</span><span class="nf">prefix</span><span class="p">(</span><span class="nv">$0</span><span class="p">))</span> <span class="p">}</span> <span class="p">??</span> <span class="n">all</span>
</code></pre></div></div>

<p>The help now looks like this:</p>

<pre><code class="language-none">USAGE: run-quiz [&lt;numbers-to-study&gt; ...] [--limit &lt;limit&gt;]

ARGUMENTS:
  &lt;numbers-to-study&gt;      Specify the numbers to study. 

OPTIONS:
  -l, --limit &lt;limit&gt;     Limit the number of questions. 
  -h, --help              Show help information.

Program ended with exit code: 0
</code></pre>

<p>By specifying the name of the option to be <code class="language-plaintext highlighter-rouge">.shortAndLong</code>, it used the name of the property <code class="language-plaintext highlighter-rouge">limit</code> (long) and just the first letter <code class="language-plaintext highlighter-rouge">l</code> (short).</p>

<blockquote>
  <p><strong>Note</strong>: If you have two options with the same argument name will have an assertion failure at runtime.</p>
</blockquote>

<h2 id="enumerated-options">Enumerated options</h2>

<p>Now create an option that controls the order of multiplication questions. Add this nested enumeration to the <code class="language-plaintext highlighter-rouge">RunQuiz</code> type:</p>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">enum</span> <span class="kt">Ordering</span><span class="p">:</span> <span class="kt">String</span><span class="p">,</span> <span class="kt">ExpressibleByArgument</span> <span class="p">{</span>
  <span class="k">case</span> <span class="n">random</span><span class="p">,</span> <span class="n">sorted</span><span class="p">,</span> <span class="n">reversed</span>

  <span class="kd">func</span> <span class="nf">arrange</span><span class="p">(</span><span class="n">_</span> <span class="nv">items</span><span class="p">:</span> <span class="p">[</span><span class="kt">Multiplication</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="p">[</span><span class="kt">Multiplication</span><span class="p">]</span> <span class="p">{</span>
    <span class="k">switch</span> <span class="k">self</span> <span class="p">{</span>
    <span class="k">case</span> <span class="o">.</span><span class="nv">random</span><span class="p">:</span>
      <span class="k">return</span> <span class="n">items</span><span class="o">.</span><span class="nf">shuffled</span><span class="p">()</span>
    <span class="k">case</span> <span class="o">.</span><span class="nv">sorted</span><span class="p">:</span>
      <span class="k">return</span> <span class="n">items</span><span class="o">.</span><span class="n">sorted</span> <span class="p">{</span> <span class="p">(</span><span class="nv">$0</span><span class="o">.</span><span class="n">a</span><span class="p">,</span> <span class="nv">$0</span><span class="o">.</span><span class="n">b</span><span class="p">)</span> <span class="o">&lt;</span> <span class="p">(</span><span class="nv">$1</span><span class="o">.</span><span class="n">a</span><span class="p">,</span> <span class="nv">$1</span><span class="o">.</span><span class="n">b</span><span class="p">)</span> <span class="p">}</span>
    <span class="k">case</span> <span class="o">.</span><span class="nv">reversed</span><span class="p">:</span>
      <span class="k">return</span> <span class="n">items</span><span class="o">.</span><span class="n">sorted</span> <span class="p">{</span> <span class="p">(</span><span class="nv">$0</span><span class="o">.</span><span class="n">a</span><span class="p">,</span> <span class="nv">$0</span><span class="o">.</span><span class="n">b</span><span class="p">)</span> <span class="o">&gt;</span> <span class="p">(</span><span class="nv">$1</span><span class="o">.</span><span class="n">a</span><span class="p">,</span> <span class="nv">$1</span><span class="o">.</span><span class="n">b</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 enumeration is a raw representable string and importantly conforms to <code class="language-plaintext highlighter-rouge">ExpressibleByArgument</code>. It defines three cases <code class="language-plaintext highlighter-rouge">.random</code>, <code class="language-plaintext highlighter-rouge">.sorted</code> and <code class="language-plaintext highlighter-rouge">reversed</code>. It also has a helper method that arranges a list of multiplication items based on the ordering.</p>

<p>Add this property:</p>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">@Option</span><span class="p">(</span><span class="nv">name</span><span class="p">:</span> <span class="o">.</span><span class="nf">customLong</span><span class="p">(</span><span class="s">"order"</span><span class="p">),</span> <span class="nv">help</span><span class="p">:</span> <span class="s">"The order of the question."</span><span class="p">)</span>
<span class="k">var</span> <span class="nv">ordering</span> <span class="o">=</span> <span class="kt">Ordering</span><span class="o">.</span><span class="n">random</span>
</code></pre></div></div>

<p>Now replace the logic for generating questions, using the <code class="language-plaintext highlighter-rouge">ordering</code> property:</p>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">let</span> <span class="nv">all</span> <span class="o">=</span> <span class="n">numbersToStudy</span><span class="o">.</span><span class="n">flatMap</span> <span class="p">{</span> <span class="n">a</span> <span class="nf">in</span>
  <span class="p">(</span><span class="mi">2</span><span class="o">...</span><span class="mi">25</span><span class="p">)</span><span class="o">.</span><span class="n">map</span> <span class="p">{</span> <span class="n">b</span> <span class="k">in</span>
    <span class="kt">Multiplication</span><span class="p">(</span><span class="nv">a</span><span class="p">:</span> <span class="n">a</span><span class="p">,</span> <span class="nv">b</span><span class="p">:</span> <span class="n">b</span><span class="p">)</span>
  <span class="p">}</span>
<span class="p">}</span>

<span class="k">let</span> <span class="nv">ordered</span> <span class="o">=</span> <span class="n">ordering</span><span class="o">.</span><span class="nf">arrange</span><span class="p">(</span><span class="n">all</span><span class="p">)</span>

<span class="k">let</span> <span class="nv">multiplications</span> <span class="o">=</span> <span class="n">limit</span><span class="o">.</span><span class="n">map</span> <span class="p">{</span> <span class="kt">Array</span><span class="p">(</span><span class="n">ordered</span><span class="o">.</span><span class="nf">prefix</span><span class="p">(</span><span class="nv">$0</span><span class="p">))</span> <span class="p">}</span> <span class="p">??</span> <span class="n">ordered</span>
</code></pre></div></div>

<p>Now you can practice multiplication shuffled, in order, or even reversed.</p>

<h2 id="flags">Flags</h2>

<p>Now create a boolean flag using <code class="language-plaintext highlighter-rouge">@Flag</code> right after the <code class="language-plaintext highlighter-rouge">limit</code> property:</p>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">@Flag</span><span class="p">(</span><span class="nv">name</span><span class="p">:</span> <span class="o">.</span><span class="nf">customLong</span><span class="p">(</span><span class="s">"show"</span><span class="p">),</span> <span class="nv">help</span><span class="p">:</span> <span class="s">"Show answers and exit."</span><span class="p">)</span>
<span class="k">var</span> <span class="nv">showAnswersAndExit</span> <span class="o">=</span> <span class="kc">false</span>
</code></pre></div></div>

<p>Notice how you can use a name that is different from the property name.  Use the variable right after you compute <code class="language-plaintext highlighter-rouge">multiplications</code>.</p>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">guard</span> <span class="o">!</span><span class="n">showAnswersAndExit</span> <span class="k">else</span> <span class="p">{</span>
  <span class="n">multiplications</span><span class="o">.</span><span class="n">forEach</span> <span class="p">{</span> <span class="n">mult</span> <span class="k">in</span>
    <span class="nf">print</span><span class="p">(</span><span class="n">mult</span><span class="o">.</span><span class="n">question</span><span class="p">,</span> <span class="s">"="</span><span class="p">,</span> <span class="n">mult</span><span class="o">.</span><span class="n">answer</span><span class="p">)</span>
  <span class="p">}</span>
  <span class="k">return</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Try it out by running with the arguments ‘17 –order sorted –show –limit 5`. You should this:</p>

<pre><code class="language-none">17·2 = 34
17·3 = 51
17·4 = 68
17·5 = 85
17·6 = 102
</code></pre>

<h2 id="set-range-of-multiplications">Set range of multiplications</h2>

<p>Give the user the ability to set the range of multiplications. Start by adding these option properties:</p>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">@Option</span><span class="p">(</span><span class="nv">name</span><span class="p">:</span> <span class="o">.</span><span class="n">shortAndLong</span><span class="p">,</span> <span class="nv">help</span><span class="p">:</span> <span class="s">"The start of the multiplication table."</span><span class="p">)</span>
<span class="k">var</span> <span class="nv">from</span><span class="p">:</span> <span class="kt">Int</span> <span class="o">=</span> <span class="mi">2</span>

<span class="kd">@Option</span><span class="p">(</span><span class="nv">name</span><span class="p">:</span> <span class="o">.</span><span class="n">shortAndLong</span><span class="p">,</span> <span class="nv">help</span><span class="p">:</span> <span class="s">"The end of the multiplication table."</span><span class="p">)</span>
<span class="k">var</span> <span class="nv">to</span><span class="p">:</span> <span class="kt">Int</span> <span class="o">=</span> <span class="mi">25</span>
</code></pre></div></div>

<p>Next, change how you compute <code class="language-plaintext highlighter-rouge">all</code> by using the properties:</p>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">let</span> <span class="nv">all</span> <span class="o">=</span> <span class="n">numbersToStudy</span><span class="o">.</span><span class="n">flatMap</span> <span class="p">{</span> <span class="n">a</span> <span class="nf">in</span>
  <span class="p">(</span><span class="n">from</span><span class="o">...</span><span class="n">to</span><span class="p">)</span><span class="o">.</span><span class="n">map</span> <span class="p">{</span> <span class="n">b</span> <span class="k">in</span>
     <span class="kt">Multiplication</span><span class="p">(</span><span class="nv">a</span><span class="p">:</span> <span class="n">a</span><span class="p">,</span> <span class="nv">b</span><span class="p">:</span> <span class="n">b</span><span class="p">)</span>
   <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>What will happen if the user specifies the <code class="language-plaintext highlighter-rouge">to</code> property smaller than <code class="language-plaintext highlighter-rouge">from</code>? Yes, it will trap and crash the program.  On my machine, the crash looks like this:</p>

<pre><code class="language-none">Fatal error: Can't form Range with upperBound &lt; lowerBound: file Swift/x86_64-apple-macos.swiftinterface, line 5584
</code></pre>

<p>Not very nice. Fortunately, the <code class="language-plaintext highlighter-rouge">ParsableCommand</code> lets you implement a <code class="language-plaintext highlighter-rouge">validate</code> method. Add this method to <code class="language-plaintext highlighter-rouge">RunQuiz</code>:</p>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">mutating</span> <span class="kd">func</span> <span class="nf">validate</span><span class="p">()</span> <span class="k">throws</span> <span class="p">{</span>
  <span class="k">guard</span> <span class="n">from</span> <span class="o">&lt;=</span> <span class="n">to</span> <span class="k">else</span> <span class="p">{</span>
    <span class="k">throw</span> <span class="kt">ValidationError</span><span class="p">(</span><span class="s">"`from` must be smaller or equal to `to`."</span><span class="p">)</span>
  <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>This method lets you check out all of your arguments and parameters before <code class="language-plaintext highlighter-rouge">run</code> gets called. Now, if you launch the command with illegal <code class="language-plaintext highlighter-rouge">--from</code> and <code class="language-plaintext highlighter-rouge">--to</code> options, you will get the helpful message:</p>

<pre><code class="language-none">Error: `from` must be smaller or equal to `to`.
</code></pre>

<h2 id="adding-some-final-touches">Adding some final touches</h2>

<p>The <code class="language-plaintext highlighter-rouge">ParsableCommand</code> protocol lets you return a custom configuration object that allows you to change many more options. Many of them are self-explanatory.</p>

<p>Add this to <code class="language-plaintext highlighter-rouge">RunQuiz</code>:</p>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">static</span> <span class="k">var</span> <span class="nv">configuration</span><span class="p">:</span> <span class="kt">CommandConfiguration</span> <span class="p">{</span>
  <span class="kt">CommandConfiguration</span><span class="p">(</span><span class="nv">commandName</span><span class="p">:</span> <span class="s">"m25"</span><span class="p">,</span>
                       <span class="nv">abstract</span><span class="p">:</span> <span class="s">"Practice multiplication at the console."</span><span class="p">,</span>
                       <span class="nv">discussion</span><span class="p">:</span> <span class="s">"""
      Practice your multiplication table.

      Examples:
         # Practice 12x2 up to 12x25 in random order.
         m25 12

        # Practice 12x2 up to 12x25, present questions in order.
        m25 --order sorted 12

        # Practice 12, 13, and 14
        m25 12 13 14

        # Practice 15, 16 but limit to 10 questions.
        m25 15 16 --limit 10

        # Show 12x2 to 12x25 in order and exit.
        m25 12 --show --order reversed

        # Show 12x12 to 12x24 in order and exit
        m25 12 --show --order sorted --from 12 --to 24
   """</span><span class="p">)</span>
<span class="p">}</span>
</code></pre></div></div>

<p>This configuration explicitly names the command to be <code class="language-plaintext highlighter-rouge">m25</code> instead of <code class="language-plaintext highlighter-rouge">run-quiz</code>.  It also provides more detailed examples of usage.</p>

<p>Additionally, you might want to add some output formatting.</p>

<h2 id="final-thoughts">Final thoughts</h2>

<p>Command-line tools are super powerful, and the Swift Argument Parser makes it quick and easy to put together a robust interface.</p>

<p>While you have used many of the features of argument parser in this little example, there are many more things to explore, including parsing custom types, changing parsing strategies, subcommands, and generating completion scripts automatically. The argument parser package comes with some excellent documentation itself, and it is easy to access from Xcode’s file navigator. Check out the Documentation and Examples folders.</p>

<p><img src="/images/posts/argument_parsing/docs-and-examples.png" alt="Documentation and Examples in Xcode" width="700px" /></p>

<p>You can find the code for this post here: <a href="https://github.com/rayfix/m25">https://github.com/rayfix/m25</a>.</p>

<p>If you find this post helpful or have questions, please reach out to me on Twitter <a href="https://twitter.com/rayfix/">@rayfix</a>.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[Command-line interfaces (CLIs) provide a robust, textual way to communicate with your programs. Swift, as a general-purpose computing platform, lets you build these kinds of tools efficiently and elegantly. In this post, you’ll have a look at the Swift package Argument Parser, which handles all the boilerplate of creating a full-featured, command-line interface.]]></summary></entry></feed>