119 votes

Quelle est la différence entre la commodité init vs init dans des exemples rapides et explicites mieux

J'ai du mal à comprendre la différence entre les deux, ou le but de la commod init. Merci

142voto

treyhakanson Points 2457

La norme init:

Désigné initialiseurs sont le principal initialiseurs d'une classe. Un désigné initialiseur entièrement initialise toutes les propriétés introduites par la classe et appelle une super-classe appropriée de l'initialiseur de continuer le processus d'initialisation jusqu'à la super-classe de la chaîne.

convenience init:

Commodité initialiseurs sont secondaires, en soutenant les initialiseurs d'un classe. Vous pouvez définir une commodité d'initialiseur d'appel désigné initialiseur de la même classe que la commodité de l'initialiseur avec certains l'initialiseur de paramètres aux valeurs par défaut. Vous pouvez également définir une commodité d'initialiseur de créer une instance de cette classe pour un cas d'utilisation ou de la valeur d'entrée type.

comme par le Swift de la Documentation

fondamentalement, tout cela pour dire en un mot, c'est que vous utilisez une commodité d'initialiseur de faire appel désigné un initialiseur plus rapide et plus "pratique". Afin de commodité initialiseurs d'exiger l'utilisation d' self.init au lieu de quelque chose comme l' super.init que vous verriez dans une substitution, un initialiseur.

pseudocode exemple:

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)
}

J'utilise ces beaucoup lors de la création de vues personnalisées et long initialiseurs qui ont principalement deafults. Les docs à faire un meilleur travail en expliquant que je peux, les vérifier!

94voto

Commodité initialiseurs sont utilisés lorsque vous avez un peu de classe avec beaucoup de propriétés qui en fait une sorte de "Douloureux" de toujours initialiser l'esprit avec toutes les variables, de sorte que ce que vous faites avec la commodité d'initialiseur, c'est que vous venez de passer quelques variables à initialiser l'objet, et d'attribuer le repos avec une valeur par défaut. Il y a une très bonne vidéo sur Ray Wenderlich site web, vous ne savez pas c'est gratuit ou pas parce que j'ai un compte payant. Voici un exemple où vous pouvez voir qu'au lieu de l'initialisation de mon objet avec toutes ces variables Im juste donner un titre.

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

16voto

user3327210 Points 11

Voici un exemple, pris dans le portail des Développeurs d'Apple.

Bref désignés initialiseur est l' init(name: String),- il s'assurer que toutes les propriétés sont initialisées.

L' init() de la commodité de l'initialiseur, en ne prenant aucun argument, définit automatiquement la valeur de name stockées propriété d' [Unnamed] en utilisant le initialiseur.

class Food {
    let name: String

    // MARK: - designated initializer
    init(name: String) {
        self.name = name
    }

    // MARK: - convenience initializer
    convenience init() {
        self.init(name: "[Unnamed]")
    }
}

// MARK: - Examples
let food = Food(name: "Cheese") // name will be "Cheese"
let food = Food()               // name will be "[Unnamed]"

Il est utile, lorsque vous traitez avec de grandes classes, avec au moins quelques stockées les propriétés. Je vous recommande de le lire un peu plus sur les options et à l'héritage, à la Pomme sur le portail des Développeurs.

3voto

Abuzar Manzoor Points 102

Remarque: Lisez Le Texte en entier

Désigné initialiseurs sont le principal initialiseurs d'une classe. Désigné initialiseur entièrement initialise toutes les propriétés mis en place par cette classe et appelle une super-classe appropriée de l'initialiseur de poursuivre le processus d'initialisation jusqu'à la super-classe de la chaîne.

Commodité initialiseurs sont secondaires, en soutenant les initialiseurs d'une classe. Vous pouvez définir une commodité d'initialiseur d'appel désigné un initialiseur de la même classe que la commodité de l'initialiseur avec certains d'initialisation des paramètres par défaut.

Désigné initialiseurs de classes sont écrits de la même manière que simple initialiseurs pour les types de valeur:

init(parameters) {
statements
}

Commodité initialiseurs sont écrits dans le même style, mais avec la commodité modificateur placé à l'avant de l'init de mots clés, séparés par un espace:

convenience init(parameters) {
statements
}

Un Exemple pratique sont comme suit:

class Food {
var name: String
init(name: String) {
    self.name = name
}
convenience init() {
    self.init(name: "[Unnamed]")
}
}
let namedMeat = Food(name: "Bacon")
// namedMeat's name is "Bacon"

L'init(nom: String) de l'initialiseur de la catégorie d'Aliments est assuré désigné initialiseur, car il garantit que toutes les propriétés d'une nouvelle Alimentaires de l'instance sont entièrement initialisé. La catégorie d'Aliments n'a pas une super-classe, et ainsi l'init(nom: String) initialiseur n'a pas besoin d'appeler super.init() pour valider son initialisation.

"Les Aliments de la classe fournit également un confort de l'initialiseur, init(), sans arguments. Le init() de l'initialiseur fournit par défaut un espace réservé de nom pour un nouvel aliment en déléguant à travers la catégorie d'Aliments init(nom: String) avec un nom de valeur de [sans nom]:"

"let mysteryMeat = Food()
// mysteryMeat's name is "[Unnamed]"

La deuxième classe de la hiérarchie est une sous-classe de la Nourriture appelé RecipeIngredient. Le RecipeIngredient modèles de la classe un ingrédient dans une recette de cuisine. Elle introduit un Int propriété appelée la quantité (en plus du nom de la propriété, il hérite de la Nourriture) et définit deux initialiseurs pour la création de RecipeIngredient instances:

class RecipeIngredient: Food {
var quantity: Int
init(name: String, quantity: Int) {
    self.quantity = quantity
    super.init(name: name)
}
override convenience init(name: String) {
    self.init(name: name, quantity: 1)
}
}

Le RecipeIngredient classe a un seul initialiseur, init(nom: String, quantité: Int), qui peut être utilisé pour remplir toutes les propriétés d'un nouveau RecipeIngredient instance. Cette initialiseur commence par affecter la quantité argument de la quantité des biens, qui est la seule nouvelle propriété introduit par RecipeIngredient. Après cela, l'initialiseur de délégués jusqu'à l'init(nom: String) de l'initialiseur de la catégorie d'Aliments.

page:536 Extrait De: Apple Inc. "Le Langage de Programmation Swift Swift 4)." iBooks. https://itunes.apple.com/pk/book/the-swift-programming-language-swift-4-0-3/id881256329?mt=11

2voto

Nirav Points 2593

Il est donc pratique lorsque vous n'avez pas besoin de spécifier chaque propriété d'une classe. Ainsi, par exemple, si je veux créer toutes les aventures avec une valeur de départ de 100 pour HP, j’utiliserais cette option de commodité suivante et ajouterais simplement un nom. Cela va beaucoup réduire le code.

 class Adventure { 

// Instance Properties

    var name: String
    var hp: Int
    let maxHealth: Int = 100

    // Optionals

    var specialMove: String?

    init(name: String, hp: Int) {

        self.name = name
        self.hp = hp
    }

    convenience init(name: String){
        self.init(name: name, hp: 100)
    }
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X