我有一个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
有人知道这是为什么吗?谢谢!
答案 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
,即好像它是通过引用传递的。因此,您只能对可以通过引用传递的内容调用变异方法。并且您不能通过引用传递未初始化的变量。