J'ai du mal à comprendre la différence entre les deux, ou le but de la commod init. Merci
Réponses
Trop de publicités?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!
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
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.
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
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)
}
}