Chaining methods in swift — (Don’t confuse with optional chaining)

The api call I was talking looks something like this:

Here , we are calling a method called request on the Almofire class. This is followed by a method called validate(statusCode:), then another method called validate(contentType:) . Then at last we can see a method called responseData with a trailing closure which returns the output of the api call.

How does it work?? Well, the logic is quite simple.

Making functions chainable is quite easy and can allow us to write using an almost DSL-like syntax.

We’ll add a new function that does something and then return self. It's that simple.

Let’s make it more clear. we normally have an init method for initializing an object of a class. We can have multiple designated as well as convenience initializers to make our job easier. We can have custom parameters for initializing the class object . Consider a class called Celcius .

class Celsius {var temperatureInCelsius: Doubleinit(fromFahrenheit fahrenheit: Double) {temperatureInCelsius = (fahrenheit — 32.0) / 1.8}init(fromKelvin kelvin: Double) {temperatureInCelsius = kelvin — 273.15}func printTemperature() {print(“Temperature is \(temperatureInCelsius)”)}}

We have two init methods, one accepting temperature in kelvin, other one in fahrenheit. The following syntax creates an object of class Celcius and using that object , we can call an instance method.

Celsius(fromKelvin: 400).printTemperature() 
// prints Temperature is 126.85

If you are aware how the above code worked, then understanding the almofire method chaining mentioned in the beginning of the article is easy to understand.

Chaining methods example:

Let’s create an APICaller class.

An api call normally have a url, an http method and parameters . If we use the above class to make an API call, it will look something like this.

let params = [“key1”:”value1",”key2":”value2"]APICaller().urlString(“www.google.com").method(.post).parameters(params).response { (resultDict) inprint(resultDict[“result”]!)}//----------------
// prints the following in console.
("Result values1","Result values2","Result values3","Result values4")

Let’s split up the above call.

  1. Create an instance of APICaller class.
  2. Call urlString method with a string as parameter. This will set the url property in APICaller class and return self .
  3. Call method method which set the method property of APICaller class and return self .
  4. Call parameters method which sets the parameters for the api call and return self .
  5. Finally, call the method called response which has a trailing closure as parameter. Here, do the API call stuff and on success or failure, call the callback closure with the result object. Here the closure takes only a dictionary of type Dictionary<String,AnyObject>.

I hope everything is clear. Either we can have a single init method with all these parameters and call a method which in turn calls the api and return the response. But, here the greatest advantage is that we need to call any chaining method only when required. If we are doing a get method call, we can skip the method method call as get is given as the default method inside the code. Also if parameters are not required, we may skip those too.

Our objective is to write less code which makes more sense!!!

Enjoy!!

If you enjoyed reading this post, please share and recommend it so others can find it 💚💚💚💚💚💚 !!!!

--

--

--

iOS and tvOS developer, dreamer, photographer 🤨

Love podcasts or audiobooks? Learn on the go with our new app.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store
Abhimuralidharan

Abhimuralidharan

iOS and tvOS developer, dreamer, photographer 🤨

More from Medium

Preventing Invalid Characters from Being Entered in a UITextField

Annotating a closure as running on the main thread

Five Notes about iOS Application with MVVM Architecture

Tips

SplitView controller in Xcode 12 and Swift 5