swift - Variable p pasada por referencia antes de ser inicializada
pass-by-reference (3)
Tu declaración de p es solo eso, una declaración. No lo has inicializado. Necesitas cambiarlo a
var p = [Human]()
O, como señala @MartinR,
var p: [Human] = []
También hay otras construcciones equivalentes, pero lo importante es que debe asignar algo a la variable declarada (en ambos casos aquí, una matriz vacía que aceptará miembros Human
).
Actualización Para completar, también podría usar:
var p: Array<Human> = []
o
var p = Array<Human>()
Tengo una clase de Humanos con una función que toma cualquier cantidad de personas y determina si una persona es mayor que cualquiera de esas personas, luego devuelve una matriz con las personas a las que es mayor.
func isOlderThan(people: Human...) -> [Human] {
var p: [Human]
for person in people {
if age > person.age {
p.append(person)
}
}
return p
}
Sin embargo en
p.append(person)
Estoy recibiendo el error
Variable p passed by reference before being initialized
Alguien seguro de por qué esto es? ¡Gracias!
Usted está mejor simplemente usando el método de filter
:
func isOlderThan(people: Human...) -> [Human] {
return people.filter { self.age > $0.age }
}
Funciona así:
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
}
}
Por cierto, en poco tiempo le resultará útil definir un método adicional especificado como:
func isOlderThan(people: [Human]) -> [Human] { ... }
porque tan pronto como tenga una matriz y como todavía no hay un método de apply
en Swift, su método original no funcionará.
append
es un método de mutating
de la estructura Array
.
Puede pensar en un método de estructura como una función con un parámetro self
oculto. De forma predeterminada, los parámetros de las funciones son constantes y, por lo tanto, no puede hacer nada que no pueda hacer con una constante. Un método de estructura mutating
necesita hacer cosas que no se pueden hacer a una constante, por lo tanto, debe tomar el parámetro inout
como inout
, es decir, como si se pasara por referencia. Por lo tanto, solo puede llamar a un método de mutación en algo que puede pasar por referencia. Y no puede pasar una variable sin inicializar por referencia.