如何解决“无法在属性初始化程序中使用实例成员'textField_1';属性初始化程序在'self'可用之前运行”?

时间:2019-07-19 05:16:11

标签: initialization runtime-error self swift5

我的编译器没有显示任何问题,但是在运行时,出现未知错误。我正在尝试将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';属性初始化程序在“自我”可用之前运行enter image description here

1 个答案:

答案 0 :(得分:0)

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

  1. 对于您而言,您无法使用属性初始化程序创建此数组,因为self在类完全初始化之后的之后才可用。
  2. 创建用户输入数组将是静态的,并且如果用户在按下按钮之前进行更新,则不会显示UITextField的最新值。

您可以通过以下两种方式之一来处理。


使用计算所得的属性:

如果将userinput转换为计算属性,则它将始终返回具有最新值的数组:

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

lazy var中创建一个UITextFields

创建lazy的{​​{1}}数组。该数组将在首次访问时创建,但是由于它包含对象,因此您将始终可以从用户那里访问最新的输入值。

textFields

,然后将您的lazy var textFields = [textField_1!, textField_2!, textField_3!, textField_4!, textField_5!] 循环更改为使用button而不是textFields[a].text!

userinput[a]!