What are convenience required initializers in Swift?

后端 未结 3 936
天涯浪人
天涯浪人 2020-12-31 05:11

I saw in this answer that the user specifies a convenience required init(). What exactly does this mean?

I understand that the required key

相关标签:
3条回答
  • 2020-12-31 06:06

    A class initializer can be marked with required to indicate that every subclass of the class must implement that initializer.

    As a subclass, you can use a designated initializer or a convenience initializer to satisfy this requirement.

    0 讨论(0)
  • 2020-12-31 06:12

    Declaring required initialiser of class as convenience lets subclasses easily inherit it and thus ommit its implementation

    protocol P {
        var some: Int! {get}
        init(some: Int)
    }
    
    class C: P {
        private(set) var some: Int!
        convenience required init(some: Int) {
            self.init()
            self.some = some
        }
    }
    
    class D: C {
        // no need in required init(some: Int)...
    }
    
    0 讨论(0)
  • 2020-12-31 06:15

    A convenience required initializer is an initializer that is enforced onto all subclasses but is not the designated initializer. This means that said initializer will eventually call a designated initializer in its initialization chain.

    Designated Initialisers

    A designated initialiser is the canonical initializer for a class and the one which all required and convenience initialisers should call. The Docs say:

    Designated initializers are the primary initializers for a class. A designated initializer fully initializes all properties introduced by that class and calls an appropriate superclass initializer to continue the initialization process up the superclass chain.

    Convenience Initialisers

    A convenience initialiser is an initializer that sets up certain configuration information on a class...conveniently. Documentation:

    Convenience initializers are secondary, supporting initializers for a class. You can define a convenience initializer to call a designated initializer from the same class as the convenience initializer with some of the designated initializer’s parameters set to default values. You can also define a convenience initializer to create an instance of that class for a specific use case or input value type.

    You do not have to provide convenience initializers if your class does not require them. Create convenience initializers whenever a shortcut to a common initialization pattern will save time or make initialization of the class clearer in intent

    Required Initialisers

    Required initializers can be thought of as a binding contract between a parents interface and subsequent subclasses. Its your means of enforcing that all your children are aware of and implement a certain set of initialisers.

    Write the required modifier before the definition of a class initializer to indicate that every subclass of the class must implement that initializer:

    0 讨论(0)
提交回复
热议问题