0 votes
in ios by (290 points)

2 Answers

0 votes
by (610 points)
Standard init:

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 init:

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.

per the Swift Documentation

In a nutshell, this means that you can use a convenience initializer to make calling a designated initializer faster and more "convenient". So convenience initializers require the use of self.init instead of the super.init you might see in an override of a designated initializer.

pseudocode example:

init(param1, param2, param3, ... , paramN) {

     // code

}

// can call this initializer and only enter one parameter,

// set the rest as defaults

convenience init(myParamN) {

     self.init(defaultParam1, defaultParam2, defaultParam3, ... , myParamN)

}

I use these a lot when creating custom views and such that have long initializers with mainly defaults. The docs do a better job explaining than I can, check them out!
0 votes
by (380 points)

Convenience initializers are used when you have some class with a lot of properties that makes it kind of "Painful" to always initialize wit with all that variables, so what you do with convenience initializer is that you just pass some of the variables to initialize the object, and assign the rest with a default value. There is a very good video on Ray Wenderlich website, not sure its free or not because I have a paid account. Here is an example where you can see that instead of initializing my object with all those variables Im just giving it a title.
struct Scene {

  var minutes = 0

}

class Movie {

  var title: String

  var author: String

  var date: Int

  var scenes: [Scene]

  init(title: String, author: String, date: Int) {

    self.title = title

    self.author = author

    self.date = date

    scenes = [Scene]()

  }

  convenience init(title:String) {

    self.init(title:title, author: "Unknown", date:2016)

  }

  func addPage(page: Scene) {

    scenes.append(page)

  }

}

var myMovie = Movie(title: "my title") // Using convenicence initializer

var otherMovie = Movie(title: "My Title", author: "My Author", date: 12) // Using a long normal initializer

Welcome to Reubro Q&A, where you can ask questions and receive answers from other members of the community.
...