swift pass-by-reference

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.