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

问题描述 投票:22回答:3

我有一个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

谁知道为什么会这样?谢谢!

swift pass-by-reference
3个回答
54
投票

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

var p = [Human]()

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

var p: [Human] = []

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

更新为了完整性,您还可以使用:

var p: Array<Human> = []

要么

var p = Array<Human>()

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方法,你的原始方法将无效。


1
投票

append是结构mutatingArray方法。

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

© www.soinside.com 2019 - 2024. All rights reserved.