Back to Blogs

Swift II - WWDC 2022 heralding a new dawn for Generics?

iOS App Development
Article
Technology, Information and Media
Apple doing something new at the WWDC. Well, that shouldn't come as a surprise at all.

That being said, Generics got its share of extra attention and shot into the limelight due to WWDC 2022.

Now, coming back to the highlights of WWDC 2022, Apple announced exciting new additions to Generics as part of Swift 5.7, leading to it getting its day in the sun.

Generics in Swift 5.7

So, what are these new additions to Generics in Swift 5.7 that got developers excited?

  • The usage of some keywords in parameter position.
  • The usage of any keyword with a protocol having associated types.
  • The unboxing of underlying concrete types to access type-specific relationships.

It’s also important to note that these were released with Xcode version 14. So, let’s explore these new additions with our pizza shop example; you remember that, don’t you?

Protocol with associated type

An associated type gives a placeholder name to a type that is used as part of the protocol. Using our pizza shop example, we start by creating PizzaTopping enum that will have various pizza toppings.

https://gist.github.com/SahilMutualMobile/a8ddaca0641834585d90fd296cbaca2c

Next, we create a protocol RestaurantItem that will have an associatedtype Message, which has a default type of String. Also, we have defined two methods — acceptOrderItem and prepareOrderItem, and both return Message type.

We will use this RestaurantItem protocol to create concrete products. For our example, we will also create PizzaType, SideDishType, and DrinkType types that conform to RestaurantItem.

https://gist.github.com/SahilMutualMobile/dca02c7ad9c31266508cdc56c0a3001d

Pizza product

Here, we’ll create a concrete product for three types of pizza — Margherita, farmhouse, and golden corn. We start by creating an enum PizzaType that conforms to String and RestaurantItem protocol while defining three cases for the three types of pizzas. Additionally, a variable type called toppings is introduced, which will hold an array of PizzaTopping depending on the case of the enum instance.

We also need to implement the two methods from RestaurantItem protocol, acceptOrderItem, and prepareOrderItem. This is because these functions will form an appropriate string based on the pizza selection and return the String.

https://gist.github.com/SahilMutualMobile/137f879f55e78bf18ed57d12c8e46409

Side dish product

Similarly, we also create a SideDishType that conforms to String and RestaurantItem protocol.

Furthermore, we also define two cases for fries and calzone while implementing the acceptOrderItem and prepareOrderItem methods.

https://gist.github.com/SahilMutualMobile/f24ed9e30dc8cc66c80efccc6ff38a44

Drinks product

Continuing in the same vein, we create DrinkType that conforms to String and RestaurantItem protocol.

We also define two cases for soda and lemonade while implementing the acceptOrderItem and prepareOrderItem methods.

https://gist.github.com/SahilMutualMobile/b3e1c5e35d073094e55052c867bf44cf

Implementation of the pizza shop

Here, we have created a new class called PizzaShop. To proceed, we also declare a variable orderNumber to keep track of the order number.

To attract customers to our pizza store, we launch an offer for customers, where they can buy one item and get the second for free. To do this, we create a method called onePlusOneOffer, which accepts some restaurant parameter. Before the launch of Swift 5.7, this feature wasn’t available, so let’s thank the Swift gods 😆

This method will accept any type that conforms to RestaurantItem. Once this is done, we can just print the output of acceptOrderItem and prepareOrderItem twice within a loop. Additionally, we also increase the order number and print the order start and order complete messages.

The pizza shop also needs another method that can accept a happy meal-like combo that includes a pizza, a side dish, and a drink in one order. It should also be able to create a custom order of any combination of restaurant items. To do this, we create a single method called mealOrder. This method will accept an array of any RestaurantItem. This capability was also not present before Swift 5.7.

Within this method, we can also loop through the array and print the acceptOrderItem and PrepareOrderItem messages.

The third new feature in Generics as part of Swift 5.7 allows the compiler to unwrap the concrete type from any abstract type definition and call the correct concrete type implementation. Thus, we can print the start and end of the order while increasing the orderNumber property.

https://gist.github.com/SahilMutualMobile/970ec5be8e973874854e588131fbbc18

Client usage

Now, we’ll create two constants of any RestaurantItem array for the happy meals. We instantiate PizzaShop class and call the mealOrder method and pass the happy meal constants or any custom order array.

And, when we call the onePlusOneOffer method and pass an order for any item in the parameter, we can get one extra item with each item ordered.

https://gist.github.com/SahilMutualMobile/c561be825267746e4209a1088ed514bb

The bottom line

With the aforementioned updates to Generics in Swift 5.7, quite a few limitations have been lifted, making it more relevant and usable in Swift codebases.

Now, you can go forth and make Generics prosper in Swift using these features. Just don’t use our pizza shop example 😆

The story around Swift doesn’t end here, as we conclude the Swift series with an exciting sneak peek into the intriguing world of SwiftUI charts, so stay tuned!

Sahil Satralkar

Sahil is an iOS engineer who constantly strives to improve his coding skills while exploring Swift programming. He enjoys watching Arsenal play and trying new fast-food joints in his spare time.

More by this author