web-dev-qa-db-fra.com

Comment créer automatiquement un initialiseur pour une classe Swift?

PDATE: Utilisez des structures et non des classes. Struct est meilleur à bien des égards a son propre initialiseur.

Ceci est ma classe de modèle. Est-il possible de créer automatiquement la méthode init? Chaque fois, je dois initialiser toutes les variables une par une et cela coûte beaucoup de temps.

class Profile {

    var id: String
    var name: String
    var image: String

    init(id: String, name: String, image: String) {
        self.id = id
        self.name = name
        self.image = image
    }
}

Je voudrais self.id = id et d'autres variables pour initialiser automatiquement.

18
Bhavuk Jain

Mise à jour À partir de Xcode 11.4

Vous pouvez refactor (menu contextuel de la souris) pour avoir généré la classe et la structure memeberwise initializer.

Remarque: struct les initialiseurs automatiques sont internes. Vous pouvez quoi générer memeberwise initializer lorsque vous écrivez un module pour le rendre public.

Clic droit> Refactoriser> 'Générer l'initialisation Memberwise'

xcode generate memberwise initialization

Pour les anciens Xcodes

Il existe un plugin pratique pour Xcode: https://github.com/rjoudrey/Swift-init-generator ou https://github.com/Bouke/SwiftInitializerGenerator

Merci aux créateurs de plugins.

25
Moris Kramer

Nous pouvons le faire avec les outils suivants:

Xcode Version 10.1 (10B61)
Toolchain: Swift Development Snapshot 2018-12-25 (a) // Not sure if the toolchain matters.

Étant donné la classe suivante (ou pour les structures si vous changez temporairement le mot clé struct en class et après refactor, revenez à struct):

class MyClass {
    let myIntProperty: Int
    let myStringProperty: String
    let myOptionalStringProperty: String?
    let myForcedUnwrappedOptionalStringProperty: String!
}

Accédez à Xcode et:

  1. Double-cliquez sur le nom de la classe
  2. Clic-droit
  3. Refactor
  4. Générer un initialiseur par membre

Les étapes ci-dessus ressemblent à ceci:

enter image description here

Juste une petite seconde plus tard, Xcode génère cet initialiseur:

internal init(myIntProperty: Int, myStringProperty: String, myOptionalStringProperty: String?, myForcedUnwrappedOptionalStringProperty: String?) {
    self.myIntProperty = myIntProperty
    self.myStringProperty = myStringProperty
    self.myOptionalStringProperty = myOptionalStringProperty
    self.myForcedUnwrappedOptionalStringProperty = myForcedUnwrappedOptionalStringProperty
}
27
J. Doe

Non, il n'y a pas une telle fonctionnalité pour les classes. Mais, si vous le concevez comme un struct, vous obtenez un initialiseur membre gratuitement - en supposant que vous ne définissez pas d'autres initialiseurs vous-même .

Par exemple:

struct Point {
    var x: Float
    var y: Float
}
...
var p = Point(x: 1, y: 2)

Depuis Le livre Swift Programming Language:

Les types de structure reçoivent automatiquement un initialiseur membre par membre s'ils ne définissent aucun de leurs propres initialiseurs personnalisés. Contrairement à un initialiseur par défaut, la structure reçoit un initialiseur par membre même si elle possède des propriétés stockées qui n'ont pas de valeurs par défaut.

L'initialiseur membre par membre est un moyen abrégé d'initialiser les propriétés de membre des nouvelles instances de structure. Les valeurs initiales des propriétés de la nouvelle instance peuvent être transmises à l'initialiseur membre par nom.

10
Paulo Mattos

Dans la nouvelle version de XCode;

Tout d'abord, cliquez sur la ligne qui contient la classe "yourclassname {" puis faites un clic droit et sélectionnez "Afficher les actions de code". Ensuite, vous pouvez cliquer sur "Générer l'initialiseur Memberwise". Et c'est tout.

1 -> Tout d'abord la ligne de clic qui contient la classe "yourclassname {"

2-> clic droit et sélectionnez "Afficher les actions de code".

0
wilddev