For those of you doing iOS, you are probably too familiar with updating the latest versions of iOS, swift, xcode. In this article we will learn about what is new on Swift 5.3 – the latest verison of the Swift language.
Let’s find out together!
1 2 |
Multi-pattern catch clauses
In this swift version, we were able to catch many error cases inside the error handling process, helping us to limit a lot of duplication. For example: When dealing with temperature error capture in the code below:
1 2 3 4 | <span class="token keyword">enum</span> <span class="token builtin">TemperatureError</span> <span class="token punctuation">:</span> <span class="token builtin">Error</span> <span class="token punctuation">{</span> <span class="token keyword">case</span> tooCold <span class="token punctuation">,</span> tooHot <span class="token punctuation">}</span> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <span class="token keyword">func</span> <span class="token function">getReactorTemperature</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token builtin">Int</span> <span class="token punctuation">{</span> <span class="token number">90</span> <span class="token punctuation">}</span> <span class="token keyword">func</span> <span class="token function">checkReactorOperational</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token builtin">String</span> <span class="token punctuation">{</span> <span class="token keyword">let</span> temp <span class="token operator">=</span> <span class="token function">getReactorTemperature</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token keyword">if</span> temp <span class="token operator"><</span> <span class="token number">10</span> <span class="token punctuation">{</span> <span class="token keyword">throw</span> <span class="token builtin">TemperatureError</span> <span class="token punctuation">.</span> tooCold <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token keyword">if</span> temp <span class="token operator">></span> <span class="token number">90</span> <span class="token punctuation">{</span> <span class="token keyword">throw</span> <span class="token builtin">TemperatureError</span> <span class="token punctuation">.</span> tooHot <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token string">"OK"</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
1 2 3 4 5 6 7 8 9 | <span class="token keyword">do</span> <span class="token punctuation">{</span> <span class="token keyword">let</span> result <span class="token operator">=</span> <span class="token keyword">try</span> <span class="token function">checkReactorOperational</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token function">print</span> <span class="token punctuation">(</span> <span class="token string">"Result: <span class="token interpolation"><span class="token delimiter variable">(</span> result <span class="token delimiter variable">)</span></span> "</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token builtin">TemperatureError</span> <span class="token punctuation">.</span> tooHot <span class="token punctuation">,</span> <span class="token builtin">TemperatureError</span> <span class="token punctuation">.</span> tooCold <span class="token punctuation">{</span> <span class="token function">print</span> <span class="token punctuation">(</span> <span class="token string">"Shut down the reactor!"</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">{</span> <span class="token function">print</span> <span class="token punctuation">(</span> <span class="token string">"An unknown error occurred."</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> |
Multiple trailing closures
Let’s observe the two writing below to see clearly on Swift 5.3 everything becomes simpler and clearer
1 2 3 4 5 6 7 8 9 10 11 12 | <span class="token keyword">struct</span> <span class="token builtin">OldContentView</span> <span class="token punctuation">:</span> <span class="token builtin">View</span> <span class="token punctuation">{</span> @ <span class="token builtin">State</span> <span class="token keyword">private</span> <span class="token keyword">var</span> showOptions <span class="token operator">=</span> <span class="token boolean">false</span> <span class="token keyword">var</span> body <span class="token punctuation">:</span> some <span class="token builtin">View</span> <span class="token punctuation">{</span> <span class="token function">Button</span> <span class="token punctuation">(</span> action <span class="token punctuation">:</span> <span class="token punctuation">{</span> <span class="token keyword">self</span> <span class="token punctuation">.</span> showOptions <span class="token punctuation">.</span> <span class="token function">toggle</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">Image</span> <span class="token punctuation">(</span> systemName <span class="token punctuation">:</span> <span class="token string">"gear"</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
1 2 3 4 5 6 7 8 9 10 11 12 | <span class="token keyword">struct</span> <span class="token builtin">NewContentView</span> <span class="token punctuation">:</span> <span class="token builtin">View</span> <span class="token punctuation">{</span> @ <span class="token builtin">State</span> <span class="token keyword">private</span> <span class="token keyword">var</span> showOptions <span class="token operator">=</span> <span class="token boolean">false</span> <span class="token keyword">var</span> body <span class="token punctuation">:</span> some <span class="token builtin">View</span> <span class="token punctuation">{</span> <span class="token builtin">Button</span> <span class="token punctuation">{</span> <span class="token keyword">self</span> <span class="token punctuation">.</span> showOptions <span class="token punctuation">.</span> <span class="token function">toggle</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> label <span class="token punctuation">:</span> <span class="token punctuation">{</span> <span class="token function">Image</span> <span class="token punctuation">(</span> systemName <span class="token punctuation">:</span> <span class="token string">"gear"</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
Synthesized Comparable conformance for enums
With Comparable we can use <,> and = comparisons to compare enum instances:
1 2 3 4 5 6 7 | <span class="token keyword">enum</span> <span class="token builtin">Size</span> <span class="token punctuation">:</span> <span class="token builtin">Comparable</span> <span class="token punctuation">{</span> <span class="token keyword">case</span> small <span class="token keyword">case</span> medium <span class="token keyword">case</span> large <span class="token keyword">case</span> extraLarge <span class="token punctuation">}</span> |
1 2 3 4 5 6 7 | <span class="token keyword">let</span> shirtSize <span class="token operator">=</span> <span class="token builtin">Size</span> <span class="token punctuation">.</span> small <span class="token keyword">let</span> personSize <span class="token operator">=</span> <span class="token builtin">Size</span> <span class="token punctuation">.</span> large <span class="token keyword">if</span> shirtSize <span class="token operator"><</span> personSize <span class="token punctuation">{</span> <span class="token function">print</span> <span class="token punctuation">(</span> <span class="token string">"That shirt is too small"</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> |
self is no longer required in many places
This swift version allows us in some cases to not need to write seft if we get an error before, let’s see the following example:
1 2 3 4 5 6 7 8 9 10 11 12 | <span class="token keyword">struct</span> <span class="token builtin">OldContentView</span> <span class="token punctuation">:</span> <span class="token builtin">View</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> body <span class="token punctuation">:</span> some <span class="token builtin">View</span> <span class="token punctuation">{</span> <span class="token function">List</span> <span class="token punctuation">(</span> <span class="token number">1</span> <span class="token punctuation">.</span> <span class="token punctuation">.</span> <span class="token operator"><</span> <span class="token number">5</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> number <span class="token keyword">in</span> <span class="token keyword">self</span> <span class="token punctuation">.</span> <span class="token function">cell</span> <span class="token punctuation">(</span> <span class="token keyword">for</span> <span class="token punctuation">:</span> number <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">func</span> <span class="token function">cell</span> <span class="token punctuation">(</span> <span class="token keyword">for</span> number <span class="token punctuation">:</span> <span class="token builtin">Int</span> <span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token operator">></span> some <span class="token builtin">View</span> <span class="token punctuation">{</span> <span class="token function">Text</span> <span class="token punctuation">(</span> <span class="token string">"Cell <span class="token interpolation"><span class="token delimiter variable">(</span> number <span class="token delimiter variable">)</span></span> "</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
We don’t need to write self.cell anymore but cell is enough instead:
1 2 3 4 5 6 7 8 9 10 11 12 | <span class="token keyword">struct</span> <span class="token builtin">NewContentView</span> <span class="token punctuation">:</span> <span class="token builtin">View</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> body <span class="token punctuation">:</span> some <span class="token builtin">View</span> <span class="token punctuation">{</span> <span class="token function">List</span> <span class="token punctuation">(</span> <span class="token number">1</span> <span class="token punctuation">.</span> <span class="token punctuation">.</span> <span class="token operator"><</span> <span class="token number">5</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> number <span class="token keyword">in</span> <span class="token function">cell</span> <span class="token punctuation">(</span> <span class="token keyword">for</span> <span class="token punctuation">:</span> number <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">func</span> <span class="token function">cell</span> <span class="token punctuation">(</span> <span class="token keyword">for</span> number <span class="token punctuation">:</span> <span class="token builtin">Int</span> <span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token operator">></span> some <span class="token builtin">View</span> <span class="token punctuation">{</span> <span class="token function">Text</span> <span class="token punctuation">(</span> <span class="token string">"Cell <span class="token interpolation"><span class="token delimiter variable">(</span> number <span class="token delimiter variable">)</span></span> "</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
Type-Based Program Entry Points
We have the main property and we will not need to create instant then call the method and call it directly as below:
1 2 3 4 5 6 7 8 9 | <span class="token keyword">struct</span> <span class="token builtin">OldApp</span> <span class="token punctuation">{</span> <span class="token keyword">func</span> <span class="token function">run</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">print</span> <span class="token punctuation">(</span> <span class="token string">"Running!"</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">let</span> app <span class="token operator">=</span> <span class="token function">OldApp</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> app <span class="token punctuation">.</span> <span class="token function">run</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> |
instead would be
1 2 3 4 5 6 7 | @main <span class="token keyword">struct</span> <span class="token builtin">NewApp</span> <span class="token punctuation">{</span> <span class="token keyword">static</span> <span class="token keyword">func</span> <span class="token function">main</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">print</span> <span class="token punctuation">(</span> <span class="token string">"Running!"</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
Conclude
Swift 5.3 has added some interesting properties, the Swift language is getting better, easier and more compact.
Thank you for your time!
Source:
https://www.hackingwithswift.com/articles/218/whats-new-in-swift-5-3