2014-07-19 59 views
15

我有一個人類類,它具有一個函數,它可以獲取任意數量的人並確定某人是否比這些人中的任何人都早,然後返回一個數組,並且他/她的年齡大於。變量p在初始化之前通過引用傳遞

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

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

然而,在

p.append(person) 

,我發現了錯誤

Variable p passed by reference before being initialized 

任何人都確信這是爲什麼?謝謝!

+0

如果你沒有_upvote_和_accept_答案,人們將不那麼積極地去幫助你 - 獎勵就像他們一樣行事。 – GoZoner

回答

46

你的p聲明就是這個聲明。你還沒有初始化它。您需要將其更改爲

var p = [Human]() 

或者,如@MartinR指出,

var p: [Human] = [] 

還有其他同等結構,太多,但重要的是你要的東西分配給聲明的變量(在這兩種情況下,一個空數組將接受Human成員)。

更新 爲了完整起見,你也可以使用:

var p: Array<Human> = [] 

var p = Array<Human>() 
+2

(或'var p:[Human] = []') –

+0

非常感謝! var p:[Human] = []工作得很好。 – Brejuro

1

你最好只使用filter方法:

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

它的工作原理像這樣:

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

順便說,用不了多久,你會發現它有用的定義一個額外的方法規定爲:

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

,因爲只要你有一個數組,因爲沒有apply方法還在Swift中,你的原始方法將不起作用。

1

append是結構Arraymutating方法。

您可以將一個結構方法看作一個帶有隱藏self參數的函數。默認情況下,函數的參數是常量,因此您無法對常量執行任何操作。 A mutating結構方法需要做的事情不能做到一個常量,因此,它必須採用self參數作爲inout,即好像它通過引用傳遞。因此,你只能對可以通過引用傳遞的東西調用一個變異方法。你不能通過引用傳遞一個未初始化的變量。