Skip to content

Commit dcc7c0f

Browse files
committed
Site updated at 2019-05-10 20:26:17 UTC
1 parent 2974ad1 commit dcc7c0f

File tree

32 files changed

+719
-246
lines changed

32 files changed

+719
-246
lines changed

atom.xml

Lines changed: 129 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<title><![CDATA[NSHint]]></title>
55
<link href="http://nshint.github.io/atom.xml" rel="self"/>
66
<link href="http://nshint.github.io/"/>
7-
<updated>2019-04-13T11:51:30+02:00</updated>
7+
<updated>2019-05-10T22:24:06+02:00</updated>
88
<id>http://nshint.github.io/</id>
99
<author>
1010
<name><![CDATA[NSHint]]></name>
@@ -13,6 +13,134 @@
1313
<generator uri="http://octopress.org/">Octopress</generator>
1414

1515

16+
<entry>
17+
18+
<title type="html"><![CDATA[Testing Codable]]></title>
19+
<link href="http://nshint.github.io/blog/2019/05/10/testing-codable/"/>
20+
21+
<updated>2019-05-10T19:55:56+02:00</updated>
22+
<id>http://nshint.github.io/blog/2019/05/10/testing-codable</id>
23+
24+
<content type="html"><![CDATA[<p>Codable is a great protocol available in Swift. It makes it possible to create a type safe JSON representations of structures used within our application with zero boilerplate.</p>
25+
26+
<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
27+
<span class='line-number'>2</span>
28+
<span class='line-number'>3</span>
29+
<span class='line-number'>4</span>
30+
<span class='line-number'>5</span>
31+
</pre></td><td class='code'><pre><code class='swift'><span class='line'><span class="k">struct</span> <span class="nl">Person</span><span class="p">:</span> <span class="n">Codable</span> <span class="p">{</span>
32+
</span><span class='line'> <span class="k">let</span> <span class="nl">name</span><span class="p">:</span> <span class="n">String</span>
33+
</span><span class='line'> <span class="k">let</span> <span class="nl">email</span><span class="p">:</span> <span class="n">String</span>
34+
</span><span class='line'> <span class="k">let</span> <span class="nl">age</span><span class="p">:</span> <span class="n">Int</span>
35+
</span><span class='line'><span class="p">}</span>
36+
</span></code></pre></td></tr></table></div></figure>
37+
38+
39+
<p>Once the structure conforms to <code>Codable</code> everything works out of the box. There&rsquo;s a nice way to test those structures and make sure that everything gets the exact JSON format that we aligned with backend.</p>
40+
41+
<!--more-->
42+
43+
44+
<p>Let&rsquo;s create the following protocol in the test bundle:</p>
45+
46+
<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
47+
<span class='line-number'>2</span>
48+
<span class='line-number'>3</span>
49+
<span class='line-number'>4</span>
50+
</pre></td><td class='code'><pre><code class='swift'><span class='line'><span class="k">protocol</span> <span class="n">JSONTestable</span> <span class="p">{</span>
51+
</span><span class='line'> <span class="k">init</span><span class="o">?</span><span class="p">(</span><span class="n">_</span> <span class="nl">json</span><span class="p">:</span> <span class="n">String</span><span class="p">)</span>
52+
</span><span class='line'> <span class="k">func</span> <span class="n">json</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="n">String</span><span class="o">?</span>
53+
</span><span class='line'><span class="p">}</span>
54+
</span></code></pre></td></tr></table></div></figure>
55+
56+
57+
<p>After that we can immediately provide an extension which conforms to that protocol in the test bundle:</p>
58+
59+
<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
60+
<span class='line-number'>2</span>
61+
<span class='line-number'>3</span>
62+
<span class='line-number'>4</span>
63+
<span class='line-number'>5</span>
64+
<span class='line-number'>6</span>
65+
<span class='line-number'>7</span>
66+
<span class='line-number'>8</span>
67+
<span class='line-number'>9</span>
68+
<span class='line-number'>10</span>
69+
<span class='line-number'>11</span>
70+
<span class='line-number'>12</span>
71+
<span class='line-number'>13</span>
72+
<span class='line-number'>14</span>
73+
</pre></td><td class='code'><pre><code class='swift'><span class='line'><span class="k">extension</span> <span class="n">JSONTestable</span> <span class="k">where</span> <span class="nl">Self</span><span class="p">:</span> <span class="n">Codable</span> <span class="p">{</span>
74+
</span><span class='line'> <span class="k">init</span><span class="o">?</span><span class="p">(</span><span class="n">_</span> <span class="nl">json</span><span class="p">:</span> <span class="n">String</span><span class="p">)</span> <span class="p">{</span>
75+
</span><span class='line'> <span class="n">guard</span>
76+
</span><span class='line'> <span class="k">let</span> <span class="n">data</span> <span class="o">=</span> <span class="n">json</span><span class="p">.</span><span class="n">data</span><span class="p">(</span><span class="nl">using</span><span class="p">:</span> <span class="p">.</span><span class="n">utf8</span><span class="p">),</span>
77+
</span><span class='line'> <span class="k">let</span> <span class="n">decoded</span> <span class="o">=</span> <span class="n">try</span><span class="o">?</span> <span class="n">JSONDecoder</span><span class="p">().</span><span class="n">decode</span><span class="p">(</span><span class="kt">Self</span><span class="p">.</span><span class="nb">self</span><span class="p">,</span> <span class="nl">from</span><span class="p">:</span> <span class="n">data</span><span class="p">)</span>
78+
</span><span class='line'> <span class="k">else</span> <span class="p">{</span> <span class="k">return</span> <span class="nb">nil</span> <span class="p">}</span>
79+
</span><span class='line'> <span class="nb">self</span> <span class="o">=</span> <span class="n">decoded</span>
80+
</span><span class='line'> <span class="p">}</span>
81+
</span><span class='line'>
82+
</span><span class='line'> <span class="k">func</span> <span class="n">json</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="n">String</span><span class="o">?</span> <span class="p">{</span>
83+
</span><span class='line'> <span class="n">guard</span> <span class="k">let</span> <span class="n">data</span> <span class="o">=</span> <span class="n">try</span><span class="o">?</span> <span class="n">JSONEncoder</span><span class="p">().</span><span class="n">encode</span><span class="p">(</span><span class="nb">self</span><span class="p">)</span> <span class="k">else</span> <span class="p">{</span> <span class="k">return</span> <span class="nb">nil</span> <span class="p">}</span>
84+
</span><span class='line'> <span class="k">return</span> <span class="n">String</span><span class="p">(</span><span class="nl">data</span><span class="p">:</span> <span class="n">data</span><span class="p">,</span> <span class="nl">encoding</span><span class="p">:</span> <span class="p">.</span><span class="n">utf8</span><span class="p">)</span>
85+
</span><span class='line'> <span class="p">}</span>
86+
</span><span class='line'><span class="p">}</span>
87+
</span></code></pre></td></tr></table></div></figure>
88+
89+
90+
<p>Then there&rsquo;s only one simple step which needs to be done in the test bundle in order to test the structure:
91+
<code>PersonTests.swift</code>:</p>
92+
93+
<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
94+
</pre></td><td class='code'><pre><code class='swift'><span class='line'><span class="k">extension</span> <span class="nl">Person</span><span class="p">:</span> <span class="n">JSONTestable</span> <span class="p">{}</span>
95+
</span></code></pre></td></tr></table></div></figure>
96+
97+
98+
<p>That&rsquo;s it! Now we can easily test the result of the serialization and deserialization :)</p>
99+
100+
<p>Example tests:</p>
101+
102+
<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
103+
<span class='line-number'>2</span>
104+
<span class='line-number'>3</span>
105+
<span class='line-number'>4</span>
106+
<span class='line-number'>5</span>
107+
<span class='line-number'>6</span>
108+
<span class='line-number'>7</span>
109+
<span class='line-number'>8</span>
110+
<span class='line-number'>9</span>
111+
<span class='line-number'>10</span>
112+
<span class='line-number'>11</span>
113+
<span class='line-number'>12</span>
114+
<span class='line-number'>13</span>
115+
<span class='line-number'>14</span>
116+
<span class='line-number'>15</span>
117+
<span class='line-number'>16</span>
118+
<span class='line-number'>17</span>
119+
</pre></td><td class='code'><pre><code class='swift'><span class='line'><span class="n">final</span> <span class="k">class</span> <span class="nl">PersonTests</span><span class="p">:</span> <span class="n">XCTestCase</span> <span class="p">{</span>
120+
</span><span class='line'> <span class="k">func</span> <span class="n">testJsonSerialization</span><span class="p">()</span> <span class="p">{</span>
121+
</span><span class='line'> <span class="k">let</span> <span class="n">person</span> <span class="o">=</span> <span class="n">Person</span><span class="p">(</span><span class="nl">name</span><span class="p">:</span> <span class="s">&quot;John Appleased&quot;</span><span class="p">,</span> <span class="nl">email</span><span class="p">:</span> <span class="s">&quot;john@appleased.com&quot;</span><span class="p">,</span> <span class="nl">age</span><span class="p">:</span> <span class="mi">30</span><span class="p">)</span>
122+
</span><span class='line'> <span class="n">XCTAssertEqual</span><span class="p">(</span><span class="n">personJson</span><span class="p">,</span> <span class="n">person</span><span class="p">.</span><span class="n">json</span><span class="p">())</span> <span class="c1">// ✅</span>
123+
</span><span class='line'> <span class="p">}</span>
124+
</span><span class='line'>
125+
</span><span class='line'> <span class="k">func</span> <span class="n">testJsonDeserialization</span><span class="p">()</span> <span class="p">{</span>
126+
</span><span class='line'> <span class="k">let</span> <span class="n">person</span> <span class="o">=</span> <span class="n">Person</span><span class="p">(</span><span class="nl">name</span><span class="p">:</span> <span class="s">&quot;John Appleased&quot;</span><span class="p">,</span> <span class="nl">email</span><span class="p">:</span> <span class="s">&quot;john@appleased.com&quot;</span><span class="p">,</span> <span class="nl">age</span><span class="p">:</span> <span class="mi">30</span><span class="p">)</span>
127+
</span><span class='line'> <span class="n">XCTAssertEqual</span><span class="p">(</span><span class="n">person</span><span class="p">,</span> <span class="n">Person</span><span class="p">(</span><span class="n">personJson</span><span class="p">))</span> <span class="c1">// ✅</span>
128+
</span><span class='line'> <span class="p">}</span>
129+
</span><span class='line'><span class="p">}</span>
130+
</span><span class='line'>
131+
</span><span class='line'><span class="n">private</span> <span class="k">let</span> <span class="n">personJson</span> <span class="o">=</span> <span class="s">&quot;&quot;&quot;</span>
132+
</span><span class='line'><span class="p">{</span><span class="s">&quot;name&quot;</span><span class="o">:</span><span class="s">&quot;John Appleased&quot;</span><span class="p">,</span><span class="s">&quot;email&quot;</span><span class="o">:</span><span class="s">&quot;john@appleased.com&quot;</span><span class="p">,</span><span class="s">&quot;age&quot;</span><span class="o">:</span><span class="mi">30</span><span class="p">}</span>
133+
</span><span class='line'><span class="s">&quot;&quot;&quot;</span>
134+
</span><span class='line'>
135+
</span><span class='line'><span class="k">extension</span> <span class="nl">Person</span><span class="p">:</span> <span class="n">JSONTestable</span><span class="p">,</span> <span class="n">Equatable</span> <span class="p">{}</span>
136+
</span></code></pre></td></tr></table></div></figure>
137+
138+
139+
<p>What do you think about this method? Is there anything which could be improved in this implementation? Please let us know :)</p>
140+
]]></content>
141+
142+
</entry>
143+
16144
<entry>
17145

18146
<title type="html"><![CDATA[Testing the camera on the simulator]]></title>
@@ -2584,30 +2712,6 @@ We can solve those situations by using the so called <code>Symbolic Breakpoints<
25842712
25852713
25862714
<p>This creates nice fade in/out animation which is exactly what we want.</p>
2587-
]]></content>
2588-
2589-
</entry>
2590-
2591-
<entry>
2592-
2593-
<title type="html"><![CDATA[Fixing UICatalog invalid asset error]]></title>
2594-
<link href="http://nshint.github.io/blog/2015/07/02/fixing-uicatalog-invalid-asset-error/"/>
2595-
2596-
<updated>2015-07-02T17:29:00+02:00</updated>
2597-
<id>http://nshint.github.io/blog/2015/07/02/fixing-uicatalog-invalid-asset-error</id>
2598-
2599-
<content type="html"><![CDATA[<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
2600-
</pre></td><td class='code'><pre><code class=''><span class='line'>CUICatalog: Invalid asset name supplied: (null), or invalid scale factor: 2.000000</span></code></pre></td></tr></table></div></figure>
2601-
2602-
2603-
<p>This error may happen when you try to load <code>UIImage</code> and your asset string is <code>nil</code>. For now this will not crash your app but may case some future problems. This may also lead to some UI inconsistency. To track down issue like this we need to set symbolic breakpoint:</p>
2604-
2605-
<!--more-->
2606-
2607-
2608-
<p><img class="center" src="http://nshint.github.io/images/uicatalog_invalid_asset/null_asset.png"></p>
2609-
2610-
<p>Add <code>$arg3 == nil</code> condition (on Simulator) or <code>$r0 == nil</code> condition on iPhone device. This will stop executing your app exactly in the line where you try to load broken image.</p>
26112715
]]></content>
26122716

26132717
</entry>

blog/2015/06/23/toggle-slow-animations/index.html

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,10 @@ <h1 class="entry-title">Toggle Slow Animations</h1>
179179
<h1>Recent Posts</h1>
180180
<ul id="recent_posts">
181181

182+
<li class="post">
183+
<a href="/blog/2019/05/10/testing-codable/">Testing Codable</a>
184+
</li>
185+
182186
<li class="post">
183187
<a href="/blog/2019/04/08/testing-the-camera-on-the-simulator/">Testing the camera on the simulator</a>
184188
</li>
@@ -195,10 +199,6 @@ <h1>Recent Posts</h1>
195199
<a href="/blog/2015/10/10/working-with-cfunction-pointers-in-swift/">Working with CFunction pointers in Swift</a>
196200
</li>
197201

198-
<li class="post">
199-
<a href="/blog/2015/10/08/bluetooth-low-energy-the-fun-way/">Bluetooth low energy the fun way</a>
200-
</li>
201-
202202
</ul>
203203
</section>
204204

blog/2015/06/24/detailed-exceptions/index.html

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,10 @@ <h1 class="entry-title">Detailed Exceptions</h1>
149149
<h1>Recent Posts</h1>
150150
<ul id="recent_posts">
151151

152+
<li class="post">
153+
<a href="/blog/2019/05/10/testing-codable/">Testing Codable</a>
154+
</li>
155+
152156
<li class="post">
153157
<a href="/blog/2019/04/08/testing-the-camera-on-the-simulator/">Testing the camera on the simulator</a>
154158
</li>
@@ -165,10 +169,6 @@ <h1>Recent Posts</h1>
165169
<a href="/blog/2015/10/10/working-with-cfunction-pointers-in-swift/">Working with CFunction pointers in Swift</a>
166170
</li>
167171

168-
<li class="post">
169-
<a href="/blog/2015/10/08/bluetooth-low-energy-the-fun-way/">Bluetooth low energy the fun way</a>
170-
</li>
171-
172172
</ul>
173173
</section>
174174

blog/2015/06/25/storyboard-localization/index.html

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,10 @@ <h1 class="entry-title">Storyboard Localization</h1>
332332
<h1>Recent Posts</h1>
333333
<ul id="recent_posts">
334334

335+
<li class="post">
336+
<a href="/blog/2019/05/10/testing-codable/">Testing Codable</a>
337+
</li>
338+
335339
<li class="post">
336340
<a href="/blog/2019/04/08/testing-the-camera-on-the-simulator/">Testing the camera on the simulator</a>
337341
</li>
@@ -348,10 +352,6 @@ <h1>Recent Posts</h1>
348352
<a href="/blog/2015/10/10/working-with-cfunction-pointers-in-swift/">Working with CFunction pointers in Swift</a>
349353
</li>
350354

351-
<li class="post">
352-
<a href="/blog/2015/10/08/bluetooth-low-energy-the-fun-way/">Bluetooth low energy the fun way</a>
353-
</li>
354-
355355
</ul>
356356
</section>
357357

blog/2015/06/27/tracking-drawing-errors/index.html

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,10 @@ <h1 class="entry-title">Tracking Down Drawing Errors</h1>
159159
<h1>Recent Posts</h1>
160160
<ul id="recent_posts">
161161

162+
<li class="post">
163+
<a href="/blog/2019/05/10/testing-codable/">Testing Codable</a>
164+
</li>
165+
162166
<li class="post">
163167
<a href="/blog/2019/04/08/testing-the-camera-on-the-simulator/">Testing the camera on the simulator</a>
164168
</li>
@@ -175,10 +179,6 @@ <h1>Recent Posts</h1>
175179
<a href="/blog/2015/10/10/working-with-cfunction-pointers-in-swift/">Working with CFunction pointers in Swift</a>
176180
</li>
177181

178-
<li class="post">
179-
<a href="/blog/2015/10/08/bluetooth-low-energy-the-fun-way/">Bluetooth low energy the fun way</a>
180-
</li>
181-
182182
</ul>
183183
</section>
184184

blog/2015/07/02/fixing-uicatalog-invalid-asset-error/index.html

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,10 @@ <h1 class="entry-title">Fixing UICatalog Invalid Asset Error</h1>
136136
<h1>Recent Posts</h1>
137137
<ul id="recent_posts">
138138

139+
<li class="post">
140+
<a href="/blog/2019/05/10/testing-codable/">Testing Codable</a>
141+
</li>
142+
139143
<li class="post">
140144
<a href="/blog/2019/04/08/testing-the-camera-on-the-simulator/">Testing the camera on the simulator</a>
141145
</li>
@@ -152,10 +156,6 @@ <h1>Recent Posts</h1>
152156
<a href="/blog/2015/10/10/working-with-cfunction-pointers-in-swift/">Working with CFunction pointers in Swift</a>
153157
</li>
154158

155-
<li class="post">
156-
<a href="/blog/2015/10/08/bluetooth-low-energy-the-fun-way/">Bluetooth low energy the fun way</a>
157-
</li>
158-
159159
</ul>
160160
</section>
161161

blog/2015/07/04/how-to-animate-uilabel-properties/index.html

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,10 @@ <h1 class="entry-title">How to Animate UILabel Properties</h1>
180180
<h1>Recent Posts</h1>
181181
<ul id="recent_posts">
182182

183+
<li class="post">
184+
<a href="/blog/2019/05/10/testing-codable/">Testing Codable</a>
185+
</li>
186+
183187
<li class="post">
184188
<a href="/blog/2019/04/08/testing-the-camera-on-the-simulator/">Testing the camera on the simulator</a>
185189
</li>
@@ -196,10 +200,6 @@ <h1>Recent Posts</h1>
196200
<a href="/blog/2015/10/10/working-with-cfunction-pointers-in-swift/">Working with CFunction pointers in Swift</a>
197201
</li>
198202

199-
<li class="post">
200-
<a href="/blog/2015/10/08/bluetooth-low-energy-the-fun-way/">Bluetooth low energy the fun way</a>
201-
</li>
202-
203203
</ul>
204204
</section>
205205

blog/2015/07/05/working-with-coretelephony-framework/index.html

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -305,6 +305,10 @@ <h1 class="entry-title">Working With Core Telephony Framework</h1>
305305
<h1>Recent Posts</h1>
306306
<ul id="recent_posts">
307307

308+
<li class="post">
309+
<a href="/blog/2019/05/10/testing-codable/">Testing Codable</a>
310+
</li>
311+
308312
<li class="post">
309313
<a href="/blog/2019/04/08/testing-the-camera-on-the-simulator/">Testing the camera on the simulator</a>
310314
</li>
@@ -321,10 +325,6 @@ <h1>Recent Posts</h1>
321325
<a href="/blog/2015/10/10/working-with-cfunction-pointers-in-swift/">Working with CFunction pointers in Swift</a>
322326
</li>
323327

324-
<li class="post">
325-
<a href="/blog/2015/10/08/bluetooth-low-energy-the-fun-way/">Bluetooth low energy the fun way</a>
326-
</li>
327-
328328
</ul>
329329
</section>
330330

blog/2015/07/12/shared-breakpoints/index.html

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,10 @@ <h1 class="entry-title">Shared Breakpoints</h1>
156156
<h1>Recent Posts</h1>
157157
<ul id="recent_posts">
158158

159+
<li class="post">
160+
<a href="/blog/2019/05/10/testing-codable/">Testing Codable</a>
161+
</li>
162+
159163
<li class="post">
160164
<a href="/blog/2019/04/08/testing-the-camera-on-the-simulator/">Testing the camera on the simulator</a>
161165
</li>
@@ -172,10 +176,6 @@ <h1>Recent Posts</h1>
172176
<a href="/blog/2015/10/10/working-with-cfunction-pointers-in-swift/">Working with CFunction pointers in Swift</a>
173177
</li>
174178

175-
<li class="post">
176-
<a href="/blog/2015/10/08/bluetooth-low-energy-the-fun-way/">Bluetooth low energy the fun way</a>
177-
</li>
178-
179179
</ul>
180180
</section>
181181

0 commit comments

Comments
 (0)