不能在 属性 初始值设定项中使用实例成员 'generateRandomNumbers'; 属性 初始值设定项 运行 在 'self' 可用之前
Cannot use instance member 'generateRandomNumbers' within property initializer; property initializers run before 'self' is available
导入 UIKit
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
@IBOutlet weak var tableView1: UITableView!
var array = generateRandomNumbers(size: 1000)
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
tableView1.delegate = self
tableView1.dataSource = self
// 可变数组 = self.generateRandomNumbers(大小:1000)
// 惰性 var array = generateRandomNumbers(size: 1000)
// 打印(数组)
}
func generateRandomNumbers(size: Int) -> [Int] {
guard size > 0 else {
return [Int]()
}
let result = Array(0..<size).shuffled()
return result
}
您要求 var array
从函数 generateRandomNumbers()
接收“默认”值。 “默认”值是在视图控制器实例初始化期间设置的,因此 before 实例存在,因此 before generateRandomNumbers()
函数存在。在实例创建完成之前,编译器不知道如何给 array
赋值。
解决方法是设置一个虚拟默认值,然后在初始化期间更改它,如下所示:
@IBOutlet weak var tableView1: UITableView!
var array = [Int]() // This is an empty array, the compiler can create it before the generateRandomNumbers() is available
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
tableView1.delegate = self
tableView1.dataSource = self
...
array = generateRandomNumbers(size: 1000) // Now that all variables are initialised, you can change their values
嗯,基本回答是理解概念。
var array = generateRandomNumbers(size: 1000)
编译代码时,它首先尝试先编译变量。所以那个时候,self
还没有启动。因此,它无法识别方法 generateRandomNumbers
。你得到了错误。
最好的解决方案实际上是使用
lazy var array = generateRandomNumbers(size: 1000)
当您使用 lazy
时,它不会在需要时尝试初始化。所以第一次编译就跳过了。
如果你不需要懒惰,你必须在 viewDidLoad()
中声明它
var array = [Int]()
override func viewDidLoad() {
super.viewDidLoad()
array = generateRandomNumbers(size: 1000)
}
导入 UIKit
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
@IBOutlet weak var tableView1: UITableView!
var array = generateRandomNumbers(size: 1000)
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
tableView1.delegate = self
tableView1.dataSource = self
// 可变数组 = self.generateRandomNumbers(大小:1000) // 惰性 var array = generateRandomNumbers(size: 1000)
// 打印(数组) }
func generateRandomNumbers(size: Int) -> [Int] {
guard size > 0 else {
return [Int]()
}
let result = Array(0..<size).shuffled()
return result
}
您要求 var array
从函数 generateRandomNumbers()
接收“默认”值。 “默认”值是在视图控制器实例初始化期间设置的,因此 before 实例存在,因此 before generateRandomNumbers()
函数存在。在实例创建完成之前,编译器不知道如何给 array
赋值。
解决方法是设置一个虚拟默认值,然后在初始化期间更改它,如下所示:
@IBOutlet weak var tableView1: UITableView!
var array = [Int]() // This is an empty array, the compiler can create it before the generateRandomNumbers() is available
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
tableView1.delegate = self
tableView1.dataSource = self
...
array = generateRandomNumbers(size: 1000) // Now that all variables are initialised, you can change their values
嗯,基本回答是理解概念。
var array = generateRandomNumbers(size: 1000)
编译代码时,它首先尝试先编译变量。所以那个时候,self
还没有启动。因此,它无法识别方法 generateRandomNumbers
。你得到了错误。
最好的解决方案实际上是使用
lazy var array = generateRandomNumbers(size: 1000)
当您使用 lazy
时,它不会在需要时尝试初始化。所以第一次编译就跳过了。
如果你不需要懒惰,你必须在 viewDidLoad()
var array = [Int]()
override func viewDidLoad() {
super.viewDidLoad()
array = generateRandomNumbers(size: 1000)
}