It can be said that for every iOS developer, the Swift language was born to mark a revolutionary step when replacing the Objective C language for too long. Experiencing the changes from 1.2 to 2.0 is already very “scary”, then you will be surprised with version 3.0 and then the upgrade to version Swift4, Swift5. However, Swift 3.0 is still a memorable milestone, the purpose of the article is for readers to understand the changes with the Swift language through versions. In Part 1, we will learn about the change from the old version of Swift to Swift 3 as a revolution. So what are those changes? What’s new in Swift 3? Let’s find out together!
All function parameters have a label (name).
In Swift 2.0, we have seen a change in the way we call functions and methods. And with this 3.0 version, we will see this change again, to a higher level. Since Swift 2.x and earlier, the method name did not require a label in the first parameter, so the name of the first parameter is always attached to the method name. For example:
1 2 3 4 5 6 7 8 9 10 11 12 | names <span class="token punctuation">.</span> <span class="token function">indexOf</span> <span class="token punctuation">(</span> <span class="token string">"Taylor"</span> <span class="token punctuation">)</span> <span class="token string">"Taylor"</span> <span class="token punctuation">.</span> <span class="token function">writeToFile</span> <span class="token punctuation">(</span> <span class="token string">"filename"</span> <span class="token punctuation">,</span> atomically <span class="token punctuation">:</span> <span class="token boolean">true</span> <span class="token punctuation">,</span> encoding <span class="token punctuation">:</span> <span class="token builtin">NSUTF8StringEncoding</span> <span class="token punctuation">)</span> <span class="token builtin">SKAction</span> <span class="token punctuation">.</span> <span class="token function">rotateByAngle</span> <span class="token punctuation">(</span> <span class="token function">CGFloat</span> <span class="token punctuation">(</span> <span class="token builtin">M_PI_2</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> duration <span class="token punctuation">:</span> <span class="token number">10</span> <span class="token punctuation">)</span> <span class="token builtin">UIFont</span> <span class="token punctuation">.</span> <span class="token function">preferredFontForTextStyle</span> <span class="token punctuation">(</span> <span class="token builtin">UIFontTextStyleSubheadline</span> <span class="token punctuation">)</span> <span class="token keyword">override</span> <span class="token keyword">func</span> <span class="token function">numberOfSectionsInTableView</span> <span class="token punctuation">(</span> tableView <span class="token punctuation">:</span> <span class="token builtin">UITableView</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 keyword">func</span> <span class="token function">viewForZoomingInScrollView</span> <span class="token punctuation">(</span> scrollView <span class="token punctuation">:</span> <span class="token builtin">UIScrollView</span> <span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token builtin">UIView</span> <span class="token operator">?</span> <span class="token builtin">NSTimer</span> <span class="token punctuation">.</span> <span class="token function">scheduledTimerWithTimeInterval</span> <span class="token punctuation">(</span> <span class="token number">0.35</span> <span class="token punctuation">,</span> target <span class="token punctuation">:</span> <span class="token keyword">self</span> <span class="token punctuation">,</span> selector <span class="token punctuation">:</span> # <span class="token function">selector</span> <span class="token punctuation">(</span> createEnemy <span class="token punctuation">)</span> <span class="token punctuation">,</span> userInfo <span class="token punctuation">:</span> <span class="token constant">nil</span> <span class="token punctuation">,</span> repeats <span class="token punctuation">:</span> <span class="token boolean">true</span> <span class="token punctuation">)</span> |
Swift 3 will default to a label request for the parameter (you can adjust it to change it), meaning that the method name will no longer specify the parameters. In fact, the end of the function name will often turn into the name of the first parameter.
To illustrate, here is a code in Swift 2.2 with the corresponding example in Swift 3:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | names <span class="token punctuation">.</span> <span class="token function">indexOf</span> <span class="token punctuation">(</span> <span class="token string">"Taylor"</span> <span class="token punctuation">)</span> names <span class="token punctuation">.</span> <span class="token function">index</span> <span class="token punctuation">(</span> of <span class="token punctuation">:</span> <span class="token string">"Taylor"</span> <span class="token punctuation">)</span> <span class="token string">"Taylor"</span> <span class="token punctuation">.</span> <span class="token function">writeToFile</span> <span class="token punctuation">(</span> <span class="token string">"filename"</span> <span class="token punctuation">,</span> atomically <span class="token punctuation">:</span> <span class="token boolean">true</span> <span class="token punctuation">,</span> encoding <span class="token punctuation">:</span> <span class="token builtin">NSUTF8StringEncoding</span> <span class="token punctuation">)</span> <span class="token string">"Taylor"</span> <span class="token punctuation">.</span> <span class="token function">write</span> <span class="token punctuation">(</span> toFile <span class="token punctuation">:</span> <span class="token string">"somefile"</span> <span class="token punctuation">,</span> atomically <span class="token punctuation">:</span> <span class="token boolean">true</span> <span class="token punctuation">,</span> encoding <span class="token punctuation">:</span> <span class="token builtin">NSUTF8StringEncoding</span> <span class="token punctuation">)</span> <span class="token builtin">SKAction</span> <span class="token punctuation">.</span> <span class="token function">rotateByAngle</span> <span class="token punctuation">(</span> <span class="token function">CGFloat</span> <span class="token punctuation">(</span> <span class="token builtin">M_PI_2</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> duration <span class="token punctuation">:</span> <span class="token number">10</span> <span class="token punctuation">)</span> <span class="token builtin">SKAction</span> <span class="token punctuation">.</span> <span class="token function">rotate</span> <span class="token punctuation">(</span> byAngle <span class="token punctuation">:</span> <span class="token function">CGFloat</span> <span class="token punctuation">(</span> <span class="token builtin">M_PI_2</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> duration <span class="token punctuation">:</span> <span class="token number">10</span> <span class="token punctuation">)</span> <span class="token builtin">UIFont</span> <span class="token punctuation">.</span> <span class="token function">preferredFontForTextStyle</span> <span class="token punctuation">(</span> <span class="token builtin">UIFontTextStyleSubheadline</span> <span class="token punctuation">)</span> <span class="token builtin">UIFont</span> <span class="token punctuation">.</span> <span class="token function">preferredFont</span> <span class="token punctuation">(</span> forTextStyle <span class="token punctuation">:</span> <span class="token builtin">UIFontTextStyleSubheadline</span> <span class="token punctuation">)</span> <span class="token keyword">override</span> <span class="token keyword">func</span> <span class="token function">numberOfSectionsInTableView</span> <span class="token punctuation">(</span> tableView <span class="token punctuation">:</span> <span class="token builtin">UITableView</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 keyword">override</span> <span class="token keyword">func</span> <span class="token function">numberOfSections</span> <span class="token punctuation">(</span> <span class="token keyword">in</span> tableView <span class="token punctuation">:</span> <span class="token builtin">UITableView</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 keyword">func</span> <span class="token function">viewForZoomingInScrollView</span> <span class="token punctuation">(</span> scrollView <span class="token punctuation">:</span> <span class="token builtin">UIScrollView</span> <span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token builtin">UIView</span> <span class="token operator">?</span> <span class="token keyword">func</span> <span class="token function">viewForZooming</span> <span class="token punctuation">(</span> <span class="token keyword">in</span> scrollView <span class="token punctuation">:</span> <span class="token builtin">UIScrollView</span> <span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token builtin">UIView</span> <span class="token operator">?</span> <span class="token builtin">NSTimer</span> <span class="token punctuation">.</span> <span class="token function">scheduledTimerWithTimeInterval</span> <span class="token punctuation">(</span> <span class="token number">0.35</span> <span class="token punctuation">,</span> target <span class="token punctuation">:</span> <span class="token keyword">self</span> <span class="token punctuation">,</span> selector <span class="token punctuation">:</span> # <span class="token function">selector</span> <span class="token punctuation">(</span> createEnemy <span class="token punctuation">)</span> <span class="token punctuation">,</span> userInfo <span class="token punctuation">:</span> <span class="token constant">nil</span> <span class="token punctuation">,</span> repeats <span class="token punctuation">:</span> <span class="token boolean">true</span> <span class="token punctuation">)</span> <span class="token builtin">NSTimer</span> <span class="token punctuation">.</span> <span class="token function">scheduledTimer</span> <span class="token punctuation">(</span> timeInterval <span class="token punctuation">:</span> <span class="token number">0.35</span> <span class="token punctuation">,</span> target <span class="token punctuation">:</span> <span class="token keyword">self</span> <span class="token punctuation">,</span> selector <span class="token punctuation">:</span> # <span class="token function">selector</span> <span class="token punctuation">(</span> createEnemy <span class="token punctuation">)</span> <span class="token punctuation">,</span> userInfo <span class="token punctuation">:</span> <span class="token constant">nil</span> <span class="token punctuation">,</span> repeats <span class="token punctuation">:</span> <span class="token boolean">true</span> <span class="token punctuation">)</span> |
These are the methods that you have called, and also the domino effect for the method called: When you connect to some framework like UIKit, the methods will follow the same “no parameter first name” rule. previous versions (this applies to Swift 3 as well).
Here are some typical examples in Swift 2.2:
1 2 3 4 5 6 | <span class="token keyword">override</span> <span class="token keyword">func</span> <span class="token function">viewWillAppear</span> <span class="token punctuation">(</span> animated <span class="token punctuation">:</span> <span class="token builtin">Bool</span> <span class="token punctuation">)</span> <span class="token keyword">override</span> <span class="token keyword">func</span> <span class="token function">tableView</span> <span class="token punctuation">(</span> tableView <span class="token punctuation">:</span> <span class="token builtin">UITableView</span> <span class="token punctuation">,</span> numberOfRowsInSection section <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> <span class="token builtin">Int</span> <span class="token keyword">override</span> <span class="token keyword">func</span> <span class="token function">didMoveToView</span> <span class="token punctuation">(</span> view <span class="token punctuation">:</span> <span class="token builtin">SKView</span> <span class="token punctuation">)</span> <span class="token keyword">override</span> <span class="token keyword">func</span> <span class="token function">traitCollectionDidChange</span> <span class="token punctuation">(</span> previousTraitCollection <span class="token punctuation">:</span> <span class="token builtin">UITraitCollection</span> <span class="token operator">?</span> <span class="token punctuation">)</span> <span class="token keyword">func</span> <span class="token function">textFieldShouldReturn</span> <span class="token punctuation">(</span> textField <span class="token punctuation">:</span> <span class="token builtin">UITextField</span> <span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token builtin">Bool</span> |
With Swift 3, all need underscore (_) before the first parameter, to signal that the caller (Objective-C code) will not use parameter labels:
1 2 3 4 5 6 | <span class="token keyword">override</span> <span class="token keyword">func</span> <span class="token function">viewWillAppear</span> <span class="token punctuation">(</span> <span class="token number">_</span> animated <span class="token punctuation">:</span> <span class="token builtin">Bool</span> <span class="token punctuation">)</span> <span class="token keyword">override</span> <span class="token keyword">func</span> <span class="token function">tableView</span> <span class="token punctuation">(</span> <span class="token number">_</span> tableView <span class="token punctuation">:</span> <span class="token builtin">UITableView</span> <span class="token punctuation">,</span> numberOfRowsInSection section <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> <span class="token builtin">Int</span> <span class="token keyword">override</span> <span class="token keyword">func</span> <span class="token function">didMoveToView</span> <span class="token punctuation">(</span> <span class="token number">_</span> view <span class="token punctuation">:</span> <span class="token builtin">SKView</span> <span class="token punctuation">)</span> <span class="token keyword">override</span> <span class="token keyword">func</span> <span class="token function">traitCollectionDidChange</span> <span class="token punctuation">(</span> <span class="token number">_</span> previousTraitCollection <span class="token punctuation">:</span> <span class="token builtin">UITraitCollection</span> <span class="token operator">?</span> <span class="token punctuation">)</span> <span class="token keyword">func</span> <span class="token function">textFieldShouldReturn</span> <span class="token punctuation">(</span> <span class="token number">_</span> textField <span class="token punctuation">:</span> <span class="token builtin">UITextField</span> <span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token operator">></span> <span class="token builtin">Bool</span> |
Remove unnecessary words
When Swift became open source last December, Swift’s guildlines API foresaw even a change in version 3 with three words: “omit needless words” (eliminating unnecessary words). And now that we’ve seen this change in Swift 3, the method name will remove the obvious words.
1 2 3 4 5 6 | <span class="token keyword">let</span> blue <span class="token operator">=</span> <span class="token builtin">UIColor</span> <span class="token punctuation">.</span> <span class="token function">blue</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token keyword">let</span> <span class="token builtin">min</span> <span class="token operator">=</span> numbers <span class="token punctuation">.</span> <span class="token function">min</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> attributedString <span class="token punctuation">.</span> <span class="token function">append</span> <span class="token punctuation">(</span> anotherString <span class="token punctuation">)</span> names <span class="token punctuation">.</span> <span class="token function">insert</span> <span class="token punctuation">(</span> <span class="token string">"Jane"</span> <span class="token punctuation">,</span> at <span class="token punctuation">:</span> <span class="token number">0</span> <span class="token punctuation">)</span> <span class="token builtin">UIDevice</span> <span class="token punctuation">.</span> <span class="token function">current</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> |
lowerCamelCase replaces UpperCamelCase with enum and property
Although not very relevant (syntactically), but using capital letters in class names, structs, properties, enums, etc., we often follow a convention: classes, structs and enum use UpperCamelCase (MyStruct, WeatherType.Cloudy), property and parameter names use lowerCamelCase (emailAddress, requestString).
However, there are some exceptions, and these will no longer exist in Swift 3: properties and parameters that begin with an abbreviation will now use lowerCamelCase.
1 2 | <span class="token keyword">let</span> red <span class="token operator">=</span> <span class="token builtin">UIColor</span> <span class="token punctuation">.</span> <span class="token function">red</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> cgColor |
This change will increase more consistency: all properties and parameters will start with lowercase letters, and there will be no exceptions.
Also, the enum case has a change, from UpperCamelCase to lowerCamelCase. In my opinion, this change is quite correct: enum is a data type (like struct), but enum value is closer to property. In other words, all Apple enum you use will now be lowercase:
1 2 3 4 5 6 7 8 9 | <span class="token builtin">UIInterfaceOrientationMask</span> <span class="token punctuation">.</span> <span class="token builtin">Portrait</span> <span class="token comment">// old</span> <span class="token builtin">UIInterfaceOrientationMask</span> <span class="token punctuation">.</span> portrait <span class="token comment">// new</span> <span class="token builtin">NSTextAlignment</span> <span class="token punctuation">.</span> <span class="token builtin">Left</span> <span class="token comment">// old</span> <span class="token builtin">NSTextAlignment</span> <span class="token punctuation">.</span> <span class="token keyword">left</span> <span class="token comment">// new</span> <span class="token builtin">SKBlendMode</span> <span class="token punctuation">.</span> <span class="token builtin">Replace</span> <span class="token comment">// old</span> <span class="token builtin">SKBlendMode</span> <span class="token punctuation">.</span> replace <span class="token comment">// new</span> |
Swifty importing of C functions
Swift 3 also introduces attributes for functions in the C language, allowing library creators to specify new ways to enter code into Swift quickly and accurately. For example, all functions that begin with “CGContext” will be mapped to properties and methods on a CGContext object.
To see more clearly, the following is an example in Swift 2.2:
1 2 3 4 5 6 7 8 9 10 11 | <span class="token keyword">let</span> ctx <span class="token operator">=</span> <span class="token function">UIGraphicsGetCurrentContext</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token keyword">let</span> rectangle <span class="token operator">=</span> <span class="token function">CGRect</span> <span class="token punctuation">(</span> x <span class="token punctuation">:</span> <span class="token number">0</span> <span class="token punctuation">,</span> y <span class="token punctuation">:</span> <span class="token number">0</span> <span class="token punctuation">,</span> width <span class="token punctuation">:</span> <span class="token number">512</span> <span class="token punctuation">,</span> height <span class="token punctuation">:</span> <span class="token number">512</span> <span class="token punctuation">)</span> <span class="token function">CGContextSetFillColorWithColor</span> <span class="token punctuation">(</span> ctx <span class="token punctuation">,</span> <span class="token builtin">UIColor</span> <span class="token punctuation">.</span> <span class="token function">redColor</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token builtin">CGColor</span> <span class="token punctuation">)</span> <span class="token function">CGContextSetStrokeColorWithColor</span> <span class="token punctuation">(</span> ctx <span class="token punctuation">,</span> <span class="token builtin">UIColor</span> <span class="token punctuation">.</span> <span class="token function">blackColor</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token builtin">CGColor</span> <span class="token punctuation">)</span> <span class="token function">CGContextSetLineWidth</span> <span class="token punctuation">(</span> ctx <span class="token punctuation">,</span> <span class="token number">10</span> <span class="token punctuation">)</span> <span class="token function">CGContextAddRect</span> <span class="token punctuation">(</span> ctx <span class="token punctuation">,</span> rectangle <span class="token punctuation">)</span> <span class="token function">CGContextDrawPath</span> <span class="token punctuation">(</span> ctx <span class="token punctuation">,</span> <span class="token punctuation">.</span> <span class="token builtin">FillStroke</span> <span class="token punctuation">)</span> <span class="token function">UIGraphicsEndImageContext</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> |
In Swift 3, CGContext can be considered as an object that you can call method, without having to repeat CGContext continuously. So, we can rewrite the code above as follows:
1 2 3 4 5 6 7 8 9 10 11 | <span class="token keyword">if</span> <span class="token keyword">let</span> ctx <span class="token operator">=</span> <span class="token function">UIGraphicsGetCurrentContext</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">let</span> rectangle <span class="token operator">=</span> <span class="token function">CGRect</span> <span class="token punctuation">(</span> x <span class="token punctuation">:</span> <span class="token number">0</span> <span class="token punctuation">,</span> y <span class="token punctuation">:</span> <span class="token number">0</span> <span class="token punctuation">,</span> width <span class="token punctuation">:</span> <span class="token number">512</span> <span class="token punctuation">,</span> height <span class="token punctuation">:</span> <span class="token number">512</span> <span class="token punctuation">)</span> ctx <span class="token punctuation">.</span> <span class="token function">setFillColor</span> <span class="token punctuation">(</span> <span class="token builtin">UIColor</span> <span class="token punctuation">.</span> <span class="token function">red</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> cgColor <span class="token punctuation">)</span> ctx <span class="token punctuation">.</span> <span class="token function">setStrokeColor</span> <span class="token punctuation">(</span> <span class="token builtin">UIColor</span> <span class="token punctuation">.</span> <span class="token function">black</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> cgColor <span class="token punctuation">)</span> ctx <span class="token punctuation">.</span> <span class="token function">setLineWidth</span> <span class="token punctuation">(</span> <span class="token number">10</span> <span class="token punctuation">)</span> ctx <span class="token punctuation">.</span> <span class="token function">addRect</span> <span class="token punctuation">(</span> rectangle <span class="token punctuation">)</span> ctx <span class="token punctuation">.</span> <span class="token function">drawPath</span> <span class="token punctuation">(</span> using <span class="token punctuation">:</span> <span class="token punctuation">.</span> fillStroke <span class="token punctuation">)</span> <span class="token function">UIGraphicsEndImageContext</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> |
Conclude
Swift is still being developed and further improved by Apple. In this part 1 article, we have grasped the changes of Swift3 compared to the previous verison. In the next part 2, we will learn about new things on Swift4 and Swift5
Thank you for taking the time to post!