3 votes

Initialisation des attributs dans une méthode différente

J'ai une classe et j'initialise les attributs avec des valeurs par défaut :

class Point {
  var x : Int
  var y : Int

  public init() {
    x = 1
    y = 1
  }
}

Maintenant, je veux avoir une méthode reset() qui remet les attributs à ces valeurs par défaut. Comme je veux éviter les redondances, j'essaie de déplacer les lignes de l'initialisateur vers la méthode reset et d'appeler cette méthode depuis init :

class Point {
  var x : Int
  var y : Int

  public init() {
    reset()
  }

  public func reset() {
    x = 1
    y = 1
  }
}

Mais ça ne marche pas. Il est dit que les attributs doivent être initialisés. Comment puis-je résoudre ce problème ?

1voto

Alladinian Points 16627

En fait, vous pouvez fournir des valeurs par défaut lors de la déclaration de la propriété :

class Point {
    var x: Int = 1
    var y: Int = 1

    public init() {
        // No need to reset x & y
        // You can event omit init alltogether, if all properties have default values...
    }

    public func reset() {
        x = 1
        y = 1
    }
}

1voto

Anton Malmygin Points 31

Vous pouvez initier vos attributs lors de la déclaration

class Point {
  var x : Int = 1
  var y : Int = 1

  public init() {
  }

  public func reset() {
    x = 1
    y = 1
  }

Bien que cela ajoute une certaine duplication, cela résout définitivement votre problème.

1voto

dfri Points 11222

Vous pourriez avoir deux privés type qui contiennent les valeurs par défaut de votre x y y et utilisez-les comme valeurs de paramètres par défaut dans votre initialisateur (ainsi que lors de la réinitialisation d'une propriété Point instance) :

class Point {
    static private let xDefault = 1
    static private let yDefault = 1

    var x: Int
    var y: Int

    public init(x: Int = Point.xDefault, y: Int = Point.yDefault) {
        self.x = x
        self.y = y
    }

    public func reset() {
        x = Point.xDefault
        y = Point.yDefault
    }
}

let p1 = Point()
print(p1.x, p1.y)    // 1 1

let p2 = Point(y: 2)
print(p2.x, p2.y)    // 1 2
p2.reset()
print(p2.x, p2.y)    // 1 1

let p3 = Point(x: -1, y: 2)
print(p3.x, p3.y)    // -1 2
p3.reset()
print(p3.x, p3.y)    // 1 1

0voto

Ashley Mills Points 10205

Vous pouvez sauter l'init tout court

class Point {
    var x = 1
    var y = 1

    public func reset() {
        x = 1
        y = 1
    }
}

-1voto

Prerak Sola Points 5531

Déclarez vos attributs facultatifs comme ci-dessous.

class Point {
  var x : Int!
  var y : Int!

  public init() {
    reset()
  }

  public func reset() {
    x = 1
    y = 1
  }
}

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