2014-07-19 5 views
15

Ho una classe umana con una funzione che richiede un numero qualsiasi di persone e determina se qualcuno è più vecchio di una di quelle persone, quindi restituisce un array con le persone che è più vecchio di .Variabile p passata per riferimento prima dell'inizializzazione

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

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

Comunque alla

p.append(person) 

sto ottenendo l'errore

Variable p passed by reference before being initialized 

Chiunque sicuro perché questo è? Grazie!

+0

E se non rispondi _upvote_ né _accept_, le persone saranno meno motivate ad aiutarti - le ricompense che agiscono come loro. – GoZoner

risposta

46

La vostra dichiarazione di p è proprio questo, una dichiarazione. Non l'hai inizializzato. È necessario cambiare a

var p = [Human]() 

Oppure, come sottolinea @MartinR,

var p: [Human] = [] 

Non ci sono altri costrutti equivalenti, anche, ma la cosa importante è che devi assegnare qualcosa alla variabile dichiarata (in entrambi i casi qui, una matrice vuota che accetterà i membri Human).

Aggiornamento Per completezza, si potrebbe anche usare:

var p: Array<Human> = [] 

o

var p = Array<Human>() 
+2

(Oppure 'var p: [Umano] = []') –

+0

Grazie mille! var p: [Human] = [] ha funzionato bene. – Brejuro

1

Sei meglio semplicemente utilizzando il metodo filter:

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

E funziona così:

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 
    } 
} 

A proposito, tra non molto lo troverete utile definire un ulteriore metodo specificato come:

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

perché non appena si dispone di un array e dal momento che non esiste un metodo ancora apply in Swift, il tuo metodo originale non funzionerà.

1

append è un metodo mutating della struttura Array.

Si può pensare a un metodo struct come una funzione con un parametro nascosto self. Per impostazione predefinita, i parametri delle funzioni sono costanti e, pertanto, non è possibile fare nulla che non sia possibile eseguire su una costante. Un metodo struct mutating deve fare cose che non possono essere eseguite su una costante, pertanto, deve prendere il parametro self come inout, ad esempio come se fosse passato per riferimento. Pertanto, puoi chiamare un metodo di muting solo su qualcosa che puoi passare per riferimento. E non puoi passare una variabile non inizializzata per riferimento.