不能在 属性 初始值设定项中使用实例成员 '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)
}