Struct vs Class

- struct is pass-by-copy and class is pass-by-reference

- pass-by-copy is preferrable to use in Swift as compared to pass-by-reference

Why use pass-by-copy (struct implementation)

- One owner

##### - No dependency ##### - Easy to compare ##### - Easy to copy

class Dog
{
    private var name: String
    private var age : Int
    
    internal init(name: String, age: Int)
    {
        self.name = name
        self.age  = age
    }
    
    internal var getSetName: String
    {
       get
       {
         return self.name
       }
       set
       {
         self.name = newValue
       }
    }
    
    internal var getSetAge: Int
    {
        get
        {
            return self.age
        }
        set
        {
            self.age = newValue
        }
    }
}



struct Cat
{
    private var name: String
    private var age : Int
    
    internal var getSetName: String
    {
        get
        {
            return self.name
        }
        set
        {
            self.name = newValue
        }
    }
    
    internal var getSetAge: Int
    {
        get
        {
            return self.age
        }
        set
        {
            self.age = newValue
        }
    }
}



let dogOne = Dog(name: "Flurry", age: 5)

// Here this is pass-by-reference, so a change in dogTwo will also be reflected in dogOne
let dogTwo = dogOne

dogTwo.getSetName = "Hunter"
print(dogTwo.getSetName)
print(dogOne.getSetName)


let catOne = Cat(name: "Twinkle", age: 3)

// Here this is pass-by-copy, so a change in catTwo will NOT be reflected in catOne
var catTwo = catOne

catTwo.getSetName = "Flossy"
print(catTwo.getSetName)
print(catOne.getSetName)

- In the above example dogOne and dogTwo are two different references to the same Dog object, so there are more than one owner here, more than one owner leads to dependencies which can span among many references which inturn are hard to keep track off

Few data-structures in Swift which are struct implementation

- Array

- Dictionary

- Data types like String, Int, Float, Double, Character, Bool