如何修复 "cannot use instance member 'textField_1' within property initializer; property initializers run before 'self' is available"?

How to fix "cannot use instance member 'textField_1' within property initializer; property initializers run before 'self' is available"?

我的编译器没有显示任何问题,但在 运行 时,我收到了一个未知错误。我正在尝试将 textField 字符串输入放入双精度数组中。不确定哪里出了问题,谁能解释一下我做错了什么。

还没有真正尝试过任何东西,但我想我必须以某种方式使用惰性语法。

import UIKit
class ViewController: UIViewController {
//  Outlets
//  textFields
@IBOutlet weak var textField_1: UITextField!
 @IBOutlet weak var textField_2: UITextField!
 @IBOutlet weak var textField_3: UITextField!
 @IBOutlet weak var textField_4: UITextField!
 @IBOutlet weak var textField_5: UITextField!

//  labels  
@IBOutlet weak var label_1: UILabel!
@IBOutlet weak var label_2: UILabel!
@IBOutlet weak var label_3: UILabel!
@IBOutlet weak var label_4: UILabel!
@IBOutlet weak var label5: UILabel!
//  Variables
var input : String = "0";
var a = 0
var age = "9.5"

override func viewDidLoad() {
    super.viewDidLoad()

    //   Do any additional setup after loading the view.
}
var numbers : [Double] = [90, 0, 0, 0, 0];  // where textfields will be converted to double
var userinput : [String?] = [textField_1.text, textField_2.text, textField_3.text, textField_4.text, textField_5.text]!; // textField storage

//  Button
@IBAction func button ()
{
    //   loop inserts userinput into numbers array
    while (a < 3) {
        numbers.insert(convert_to_double(input1: userinput[a]!) ,at: a)// inserts userinput after
        a += 1 // stops loop and changes array index
    }
}
//   converts strings to double
func convert_to_double(input1: String) -> Double
{
    let input0 : Double? = Double(input1);
  return input0!
}
}

:0: 错误:无法在 属性 初始值设定项中使用实例成员 'textField_1'; 属性 初始值设定项 运行 在 'self' 可用之前enter image description here

您正在尝试使用索引值访问用户的输入。创建文本输入值数组有两个问题:

  1. 在您的情况下,您不能使用 属性 初始值设定项创建此数组,因为 self 之后才可用 class 已经完全初始化。
  2. 创建用户输入数组将是静态的,如果用户在按下按钮之前更新了 UITextFields,则不会显示最新值。

您可以通过以下两种方式之一处理此问题。


使用计算属性:

如果您将 userinput 转换为 计算的 属性,那么它将始终 return 具有最新值的数组:

var userinput : [String?] { return [textField_1.text, textField_2.text, textField_3.text, textField_4.text, textField_5.text] }

缺点是每次访问userinput都会重新创建这个数组,效率有点低,但它确保数组包含最新的值。您可以将其分配给 button 顶部的局部变量,以避免在循环中重新创建数组:

@IBAction func button ()
{
    let userinput = self.userinput

    //   loop inserts userinput into numbers array
    while (a < 3) {
        numbers.insert(convert_to_double(input1: userinput[a]!) ,at: a)// inserts userinput after
        a += 1 // stops loop and changes array index
    }
}

创建UITextFieldslazy var:

创建 textFieldslazy 数组。该数组将在第一次访问时创建,但由于它包含对象,您将始终可以访问用户的最新输入值。

lazy var textFields = [textField_1!, textField_2!, textField_3!, textField_4!, textField_5!]

然后更改 button 循环以使用 textFields[a].text! 而不是 userinput[a]!:

@IBAction func button ()
{
    //   loop inserts userinput into numbers array
    while (a < 3) {
        numbers.insert(convert_to_double(input1: textFields[a].text!) ,at: a)// inserts userinput after
        a += 1 // stops loop and changes array index
    }
}