Swift classes supports having multiple ways of being initialized. Following Apple’s specs this 3 rules must be respected:

  1. A designated initializer must call a designated initializer from its immediate superclass.

    https://s3-us-west-2.amazonaws.com/secure.notion-static.com/c5d7f7e3-aff1-4dac-8f88-410639297ca9/Untitled.png

  2. A convenience initializer must call another initializer from the same class.

  3. A convenience initializer must ultimately call a designated initializer.

    https://s3-us-west-2.amazonaws.com/secure.notion-static.com/b4bdfbad-5afb-4a9c-9b6e-98a998d2143a/Untitled.png

class Foo {

    var someString: String
    var someValue: Int
    var someBool: Bool

    // Designated Initializer
    init(someString: String, someValue: Int, someBool: Bool)
    {
        self.someString = someString
        self.someValue = someValue
        self.someBool = someBool
    }

    // A convenience initializer must call another initializer from the same class.
    convenience init()
    {
        self.init(otherString: "")
    }
    
    // A convenience initializer must ultimately call a designated initializer.
convenience init(otherString: String)
    {
        self.init(someString: otherString, someValue:  0, someBool: false)
    }
}

class Baz: Foo
{
    var someFloat: Float
    
    // Designed initializer
    init(someFloat: Float)
    {
        self.someFloat = someFloat
        
        // A designated initializer must call a designated initializer from its immediate superclass.
        super.init(someString: "", someValue: 0, someBool: false)
    }
    
    // A convenience initializer must call another initializer from the same class.
    convenience init()
    {
        self.init(someFloat: 0)
    }
}

Designated Initializer

let c = Foo(someString: "Some string", someValue: 10, someBool: true)

Convenience init()

let a = Foo()

Convenience init(otherString: String)

let b = Foo(otherString: "Some string")

Designated Initializer (will call the superclass Designated Initializer)

let d = Baz(someFloat: 3)

Convenience init()

let e = Baz()

Image source: The Swift Programming Language