I just have watched the What's new in Swift from WWDC 2018 and I thought it is a great motivation to write a blog post about this talk and summarize what I learned.
And here are some new Swift 4.2 features that I really liked.
Hope you will enjoy! π€
π SE-0194 Derived Collection of Enum Cases
In case we need to print all available enum values, we had to create some helper variable that includes all enum cases. For example, a static array called allCases
. A big drawback in that approach is that we need to remember to update the allCases
array every time when we modify enum cases.
Swift 4.1 approach:
enum CarType {
case sedan
case crossover
case hothatch
case muscle
case miniVan
static var allCases : = [.sedan, .crossover, .hothatch, .muscle, miniVan]
}
in Swift 4.2 we can work with CaseIterable
protocol which does all the work for us! Please take a look at the below example:
// CaseIterable protocol gave us a `allCases` variable, which is an array of all cases in the Enum.
enum CarType : CaseIterable {
case sedan
case crossover
case hothatch
case muscle
case miniVan
//there is no need to add `allCases` variable. `CaseIterable` protocol do the job!
}
for type in CarType.allCases {
print(type)
}
π Conditional Conformance
let arrayOfArrays = [[1,2],[3,4],[5,6]]
arrayOfArrays.contains([1,2]) // return false in Swift 4.1
arrayOfArrays.contains([1,2]) // now it returns True because of fact that the elements in the array conforms to Equatable protocol
It will work with Optional
, Dictionary
types as well.
The conditional conformance works in the same way with Hashable
, Encodable
and Decodable
protocols.
So for example, because Int
is Hashable
, which means in that case that Int?
is Hashable
too, and as a result the [Int?]
is Hashable
as well!
let s: Set<[Int?]> = [[1, nil, 2], [3, 4], [5, nil, nil]]
s.contains([1,nil,2]) // returns true
π Bool toggle
var isTheWeatherNice : Bool = true
print(isTheWeatherNice) // prints true
//now it's starts raining
isTheWeatherNice.toggle() // it will change the bool value.
print(isTheWeatherNice) // prints false
Small, but in my opinion - very nice feature. I meet that extension for the first time while reading that objc.io blog posts.
Now it's built into Swift 4.2. π
π Hashable protocol
protocol Hashable {
func hash(into hasher: inout Hasher)
}
In Swift 4.2 we don't have to provide custom algorithms for hashValue
. Now swift handles a hash method quality with run performance.
Important thing is that the hashValue
use the random per-process seed which is created at the every app starts.
struct City: Hashable {
let name : String
let state : String
let population : String
}
extension City : Hashable {
func hash(into hasher: inout Hasher) {
name.hash(into: &hasher)
state.hash(into: &hasher)
}
}
let warsaw = City(name : "Warsaw", state: "Mazowieckie")
print(warsaw.hashValue) // will print hash value, using the Swift algorithms from hash function.
β οΈ
In that approach, you should change the code that relates to the hashValue
as a constant. In every application run, the hash value will be different.
β οΈ
π SE-0202 Random Unification
Swift 4.1 approach:
let randomIntFrom1to10 = 1 + (arc4random() % 10) // return random number is the 1...6
But in Swift 4.2 there is no need to use arc4random()
anymore. π
let randomIntFrom0To20 = Int.random(in: 0 ..< 20)
let randomFloat = Float.random(in: 0 ..< 1)
Super cool thing is that we can get a random value from Collection types like Array
or Dictionary
.
let names = ["John", "Paul", "Peter", "Tim"]
names.randomElement()!
let playerNumberToName : [Int: String] = [9: "Lewandowski", 7: "Ronaldo"]
playerNumberToName.randomElement()!
As you might notice, the randomElement
function returns an Optional, because of the case where we call this function on the empty collection.
let emptyCollection : [String] = []
emptyCollection.randomElement() // retuns nil
Another new function are shuffle
or shuffled
functions.
let names = ["John", "Paul", "Peter", "Tim"]
let shuffledNames = names.shuffled() // returns an array of names in shuffled order.
π Conclusion
It would be great to use those features in stable versions. My impressions from Xcode 10(beta) and Swift 4.2 was pretty amazing. I highly recommend you to watch What's new in Swift talk from WWDC 2018
Below you can find a link to a GitHub gist with all features described above.
https://gist.github.com/kamwysoc/e9322c84fd4fa051cb747ec08193dc0d
Top comments (0)