Initialization “如何修复”;无法使用实例成员';textField_1';在属性初始值设定项内;属性初始值设定项在';自我';有空吗;?

Initialization “如何修复”;无法使用实例成员';textField_1';在属性初始值设定项内;属性初始值设定项在';自我';有空吗;?,initialization,runtime-error,self,swift5,Initialization,Runtime Error,Self,Swift5,我的编译器没有显示任何问题,但在运行时,我得到一个未知错误。我试图将textField字符串输入放入一个双数组中。不知道怎么了,有人能解释一下我做错了什么吗 我还没有真正尝试过任何东西,但我认为我必须以某种方式使用惰性语法 import UIKit class ViewController: UIViewController { // Outlets // textFields @IBOutlet weak var textField_1: UITextField! @IBOutlet w

我的编译器没有显示任何问题,但在运行时,我得到一个未知错误。我试图将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!
}
}
导入UIKit
类ViewController:UIViewController{
//出口
//文本字段
@IBOUTLE弱变量文本字段\u 1:UITextField!
@IBOUTLE弱var textField_2:UITextField!
@IBOUTLE弱var textField_3:UITextField!
@IBOUTLE弱var textField_4:UITextField!
@IBOUTLE弱变量文本字段_5:UITextField!
//标签
@IBOUTLE弱var标签\u 1:UILabel!
@IBOUTLE弱var标签\u 2:UILabel!
@IBOUTLE弱var标签\u 3:UILabel!
@IBOUTLE弱var标签_4:UILabel!
@IBV弱var标签5:UILabel!
//变数
变量输入:String=“0”;
变量a=0
var age=“9.5”
重写func viewDidLoad(){
super.viewDidLoad()
//加载视图后执行任何其他设置。
}
变量编号:[Double]=[90,0,0,0,0];//其中textfields将转换为Double

var userinput:[String?]=[textField_1.text,textField_2.text,textField_3.text,textField_4.text,textField_5.text]!//textField存储 //钮扣 @iAction func按钮() { //循环将用户输入插入数字数组 while(a<3){ numbers.insert(将\u转换为\u double(input1:userinput[a]!),at:a)//在后面插入userinput a+=1//停止循环并更改数组索引 } } //将字符串转换为双精度 func将双精度转换为双精度(input1:String)->double { 让输入0:Double?=Double(输入1); 返回输入0! } }

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

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

  • 在您的情况下,无法使用属性初始值设定项创建此数组,因为类完全初始化后,
    self
    才可用
  • 创建用户输入数组将是静态的,如果用户在按下按钮之前更新了一个值,则不会显示
    UITextField
    s的最新值
  • 您可以通过以下两种方式之一处理此问题


    使用计算属性:

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

    var userinput : [String?] { return [textField_1.text, textField_2.text, textField_3.text, textField_4.text, textField_5.text] }
    
    缺点是每次访问
    userinput
    都会重新创建这个数组,虽然效率有点低,但它会确保数组包含最新的值。您可以将其分配给
    按钮顶部的局部变量,以避免在循环中重新创建数组:

    @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
        }
    }
    
    然后将
    按钮更改为使用
    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
        }
    }
    
    @IBAction func按钮()
    {
    //循环将用户输入插入数字数组
    while(a<3){
    numbers.insert(将\u转换为\u double(input1:textFields[a].text!),at:a)//在
    a+=1//停止循环并更改数组索引
    }
    }
    
    var userinput:[String?]=[textField_1.text,textField_2.text,textField_3.text,textField_4.text,textField_5.text];//textField存储将此代码替换为viewDidLoad()无效。你试过了吗?因为它对我不起作用你的
    convert\u to\u double(input1:str)
    相当于
    double(str),因此不会增加太多。你应该避免强行拆开你无法控制的东西。如果用户输入未转换为
    Double
    ,则可以使用nil合并运算符提供默认值:例如
    Double(textFields[a].text!)??0
    .convert_to_double(input1:str)像你说的那样没有任何意义,但我要添加更多的代码来检查某些字符是否是类型。我最终使用了双精度(textFields[a].text!)??0 . 谢谢现在我正试着在里面打印双打numbers@Pep3这回答了你的问题吗?如果是,请点击左边的灰色复选标记将其变为绿色来接受。非常感谢!是的,但是如果你有时间,你也可以告诉我如何更新一些标签或只是打印数字,以确保文本字段输入转换为双精度,然后放入数字数组。你可以在代码的关键点添加打印语句,它们将打印到控制台。此外,您还可以设置断点并逐步查看代码的进度。
    @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
        }
    }