Thursday, August 9, 2018

Swift Comparable Protocol



Before reading this post, I would suggest to go through my post on Equatable protocol

Because, Comparable protocol extends from Equatable Protocol.

Equatable helps in comparing custom class objects and finding them in a collection.

Comparable protocol helps in comparing(< , > , <=, >=) and sorting of custom class objects.

<= and >= uses Equatble stuff as Comparable protocol extends from to Equatable protocol.

Most of the native classes confirm to comparable protocol which gives direct comparison access.


       
 let fruit1 = "banana"
 let fruit2 = "grapes"
        
      if fruit1 < fruit2  {
         print("YES!")
     
      else {
         print("NO!")
      }




Most of the native classes confirm to comparable protocol which gives direct sort() method for collection.

       
 var fruits = ["banana", "apple", "grapes"]

 fruits.sort()

 print(fruits)  //["apple", "banana", "grapes"]



Here we don’t need to write any logic.


Where as for custom classes, We need to explicitly write the sort logic by using sort(by:) method.

       
  struct Address: Equatable {
    
    let city: String
    let state: String
    let country: String
    
   }

  var addresses = [

  Address(city: "Amsterdam", state: "New York", country: "America"),

  Address(city: "Belmont", state: "California", country: "America"),

  Address(city: "Hartford", state: "Connecticut", country: "America")]
        
 addresses.sort(by: { $0.state < $1.state })





Instead of this, Address struct can confirm to Comparable protocol and we can have ability to directly compare(< , > , <=, >=).

For Equatable, we don’t need to write boiler plate code from Swift 4.1 onwards, whereas for Comparable, we need to write.

       
 struct Address: Comparable {
    
      let city: String
      let state: String
      let country: String
    
      static func < (lhs: Address, rhs: Address) -> Bool {
          return lhs.city < rhs.city
      }
    
  }



I am comparing city name for sorting here.

Now, we can directly compare our Address custom objects with comparison operators(< , > , <=, >=).

       
    let currentAddress = Address(city: "Amsterdam", state: 
            "New York", country: "America")


    let selectedAddress = Address(city: "Hartford", state: 
            "Connecticut", country: "America")
        
        if currentAddress < selectedAddress {
            print("Show current address first")
        
        else {
            print("Show selectedAddress address first")
        }



As we are mentioned the logic for Comparison, Our Address collection will have direct sort() method now.









       

  var addresses = [

  Address(city: "Amsterdam", state: "New York", country:      
                                                                       "America"),


  Address(city: "Belmont", state: "California", country: 
                                                                       "America"),
  
  Address(city: "Hartford", state: "Connecticut", country:     
                                                                       "America")]
        
  addresses.sort()




That’s how we can make use of Comparable protocol and have comparison quite easy like native objects.


Hope this post is useful. Feel free to comment in case of any queries.


No comments:

Post a Comment