web-dev-qa-db-fra.com

Variable p passée par référence avant d'être initialisée

J'ai une classe humaine avec une fonction qui prend n'importe quel nombre de personnes et détermine si quelqu'un est plus âgé que n'importe laquelle de ces personnes, puis retourne un tableau avec les personnes dont il est plus âgé que.

func isOlderThan(people: Human...) -> [Human] {
    var p: [Human]

    for person in people {
        if age > person.age {
            p.append(person)
        }
    }
    return p
}

Cependant à

p.append(person)

Je reçois l'erreur

Variable p passed by reference before being initialized

Quelqu'un sait pourquoi c'est? Merci!

23
Brejuro

Votre déclaration de p n'est que cela, une déclaration. Vous ne l'avez pas initialisé. Vous devez le changer en

var p = [Human]()

Ou, comme le souligne @MartinR,

var p: [Human] = []

Il existe également d'autres constructions équivalentes, mais l'important est que vous devez attribuer quelque chose à la variable déclarée (dans les deux cas ici, un tableau vide qui acceptera les membres Human).

Mettre à jour Pour être complet, vous pouvez également utiliser:

var p: Array<Human> = []

ou

var p = Array<Human>()
57
Grimxn

Il vaut mieux utiliser simplement la méthode filter:

func isOlderThan(people: Human...) -> [Human] {
  return people.filter { self.age > $0.age }
}

Cela fonctionne comme ceci:

 20> class Human {
 21.     let age : Int
 22.     init (age: Int) { self.age = age }
 23.     func isOlderThan (people: Human...) -> [Human] {
 24.         return people.filter { self.age > $0.age }
 25.     }
 26. }

 28> let me = Human(age:27)
me: Human = {
  age = 27
}

 29> me.isOlderThan (Human(age:25), Human(age:30))
$R10: [Human] = 1 value {
  [0] = {
    age = 25
  }
}

Soit dit en passant, avant longtemps, vous trouverez utile de définir une méthode supplémentaire spécifiée comme:

func isOlderThan(people: [Human]) -> [Human] { ... }

car dès que vous avez un tableau et qu'il n'y a pas encore de méthode apply dans Swift, votre méthode d'origine ne fonctionnera pas.

1
GoZoner

append est une méthode mutating de la structure Array.

Vous pouvez considérer une méthode struct comme une fonction avec un paramètre self masqué. Par défaut, les paramètres des fonctions sont des constantes et vous ne pouvez donc rien y faire que vous ne pouvez pas faire à une constante. Une méthode mutating struct doit faire des choses qui ne peuvent pas être faites à une constante, par conséquent, elle doit prendre le paramètre self comme inout, c'est-à-dire comme si elle était passée par référence. Ainsi, vous ne pouvez appeler une méthode de mutation que sur quelque chose que vous pouvez transmettre par référence. Et vous ne pouvez pas passer une variable non initialisée par référence.

1
newacct