J'ai une classe et 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 définit les attributs sur ces valeurs par défaut. Parce que je veux éviter les redondances, j'essaie de déplacer les lignes de l'initialiseur vers la méthode de réinitialisation 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 dit que les attributs doivent être initialisés. Comment puis-je résoudre ce problème?

4
altralaser 27 janv. 2017 à 13:12

5 réponses

Meilleure réponse

Vous pouvez ignorer complètement l'initialisation…

class Point {
    var x = 1
    var y = 1

    public func reset() {
        x = 1
        y = 1
    }
}
0
Ashley Mills 27 janv. 2017 à 10:26

Vous pouvez avoir deux membres type privés qui détiennent les valeurs par défaut de vos propriétés x et y, et les utiliser comme valeurs de paramètre par défaut dans votre initialiseur (ainsi que les utiliser lors de la réinitialisation d'une instance Point):

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
1
dfri 27 janv. 2017 à 10:33

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
  }
}
-1
Prerak Sola 27 janv. 2017 à 10:17

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

1
Anton Malmygin 27 janv. 2017 à 10:20

En fait, vous pouvez fournir des valeurs par défaut lors de la déclaration de 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
    }
}
1
Alladinian 27 janv. 2017 à 10:20