2 votes

Qu'est-ce que cela signifie lorsqu'une variable optionnelle est <non initialisée> dans un contrôleur de vue ?

J'ai un contrôleur de vue qui affiche les détails de mon entité "SkillGroup". Je veux l'utiliser à la fois pour afficher et modifier/créer un "SkillGroup". J'ai donc une variable facultative skillGroup qui est soit non définie - et nulle lorsque vous créez le SkillGroup pour la première fois et avant de le sauvegarder, soit définie et vous ne ferez que visualiser le SkillGroup. Voici mon code

class GroupViewController:UIViewController { 

    var skillGroup: SkillGroup?
    override func viewDidLoad() {
        super.viewDidLoad()
        if let skillGroup = skillGroup {
            self.title = skillGroup.name
        }
    }
}

et dans le contrôleur de vue précédent :

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "createGroupSegue" {
        let destination = segue.destination as? GroupViewController
        destination?.createOrEdit = true
    }
    if segue.identifier == "showGroupSegue" {
        if let selectedGroupPath = self.groupsTableView.indexPathForSelectedRow {
            let destination = segue.destination as? GroupViewController
            destination?.createOrEdit = false
            let group = groups[selectedGroupPath.row]
            destination?.skillGroup = group
        }
    }
}

Si je place un point d'arrêt juste après l'appel à super, et que j'inspecte skillGroup, il est dit que son <uninitialized> . Je ne pense pas que ce soit le cas parce que c'est "nil" comme une variable optionnelle normale qui n'a pas été définie. De plus, j'ai défini la variable skillGroup dans le code de préparation de la transition.

Je n'arrive pas à trouver beaucoup d'informations sur ce que cela signifie. Quelqu'un peut-il m'aider ?

2voto

ndreisg Points 426

Je pense que vous inspectez la mauvaise variable dans le débogueur (la variable locale au lieu de la variable d'instance).

J'ai fait un échantillon rapide :

class ViewController: UIViewController {
  public class TestClass {
    var foo: String
    var bar: Int

    init() {
      foo = "foo"
      bar = 4711
    }
  }

  public var test: TestClass?

  override func viewDidLoad() {
    super.viewDidLoad()

    test = TestClass()

    if let test = test {
      print(test.foo)
    }
  }
}

Quand je place un point d'arrêt sur la ligne if let test = test { Je verrai ce qui suit dans le débogueur :

debugger

Ici, vous pouvez voir qu'il va imprimer <uninitialized> lorsque j'imprime la description de l'unité locale test car la variable let sur cette ligne n'a pas encore été exécutée.

Veuillez noter qu'il existe une variable locale (qui n'existe qu'à l'intérieur du fichier if ) et une variable d'instance. Dans le débogueur, vous verrez les variables d'instance lorsque vous développerez l'objet self nœud.

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