在初始化之前通过引用传递的变量p

时间:2014-07-19 07:46:17

标签: swift pass-by-reference

我有一个Human类,其功能可以接收任意数量的人,并确定某人是否比其中任何一个人年龄大,然后返回一个他/她年龄大的人的数组。

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

有人知道这是为什么吗?谢谢!

3 个答案:

答案 0 :(得分:54)

你的p声明就是声明。你还没有初始化它。您需要将其更改为

var p = [Human]()

或者,正如@MartinR指出的那样,

var p: [Human] = []

还有其他等效构造,但重要的是你必须为声明的变量赋予一些东西(在这两种情况下,都是一个接受Human成员的空数组。)

更新的 为了完整起见,您还可以使用:

var p: Array<Human> = []

var p = Array<Human>()

答案 1 :(得分: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] { ... }

因为只要你有一个数组并且因为Swift中没有apply方法,你的原始方法就不会工作。

答案 2 :(得分:1)

append是结构mutating的{​​{1}}方法。

您可以将struct方法视为具有隐藏Array参数的函数。默认情况下,函数的参数是常量,因此您无法对常量执行任何操作。 self struct方法需要执行无法对常量执行的操作,因此,它必须将mutating参数作为self,即好像它是通过引用传递的。因此,您只能对可以通过引用传递的内容调用变异方法。并且您不能通过引用传递未初始化的变量。