无法使用实例成员“generateRandomNumbers”在属性初始值设定项内;属性初始值设定项在“self”之前运行可用

发布于 2025-01-10 15:16:55 字数 737 浏览 2 评论 0原文

导入 UIKit

类 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

// var array = self.generateRandomNumbers(size: 1000) // 惰性 var array =generateRandomNumbers(size: 1000)

// print(array) }

func generateRandomNumbers(size: Int) -> [Int] {
    guard size > 0 else {
        return [Int]()
    }
    let result = Array(0..<size).shuffled()
    return result
    
}

import 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

// var array = self.generateRandomNumbers(size: 1000)
// lazy var array = generateRandomNumbers(size: 1000)

// print(array)
}

func generateRandomNumbers(size: Int) -> [Int] {
    guard size > 0 else {
        return [Int]()
    }
    let result = Array(0..<size).shuffled()
    return result
    
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

眼泪也成诗 2025-01-17 15:16:55

您要求 var array 从函数 generateRandomNumbers() 接收“默认”值。 “默认”值是在视图控制器实例初始化期间设置的,因此在实例存在之前,即在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

You are asking var array to receive a "default" value from the function generateRandomNumbers(). The "default" value is set during the initialisation of the instance of your view controller, so before the instance exists, so before the generateRandomNumbers() function exists. The compiler doesn't know how to give a value to array before the instance has finished being created.

A workaround is to set a dummy default value, then change it during initialisation, like this:

@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
梦在深巷 2025-01-17 15:16:55

嗯,基本的答案是理解的概念。

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)
}

Well, the basic answer is the concept of understanding.

var array = generateRandomNumbers(size: 1000)

When the code is compiled, it first tries to compile the variables first. So at that time, self isn't initiated. So, therefore, it doesn't recognize the method generateRandomNumbers. You get the error.

The best possible solution is actually using

lazy var array = generateRandomNumbers(size: 1000)

When you use lazy it doesn't try to initialize until it is needed. So they are skipped for the first time compilation.

If you don't need lazy simply you have to declare it in the viewDidLoad()

var array = [Int]()

override func viewDidLoad() {
   super.viewDidLoad()
   array = generateRandomNumbers(size: 1000)
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文