Как исправить - нельзя использовать член экземпляра textField_1 в инициализаторе свойства; инициализаторы свойств запускаются до того, как станет доступным "self"?

Мой компилятор не показывает никаких проблем, но во время выполнения я получаю неизвестную ошибку. Я пытаюсь поместить ввод строки 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" станет доступным. введите здесь описание изображения


person Pep3    schedule 19.07.2019    source источник
comment
var userinput: [String?] = [textField_1.text, textField_2.text, textField_3.text, textField_4.text, textField_5.text]; // Хранилище textField Замените этот код на viewDidLoad ()   -  person Vinu Jacob    schedule 19.07.2019
comment
не сработало. Вы попробовали, потому что это не сработало для меня   -  person Pep3    schedule 19.07.2019


Ответы (1)


Вы пытаетесь получить доступ к вводу пользователя с помощью значения индекса. При создании массива значений ввода текста возникают две проблемы:

  1. В вашем случае вы не можете создать этот массив с помощью инициализатора свойства, потому что self недоступен до после полной инициализации класса.
  2. Создание массива пользовательских вводов будет статическим и не будет отображать последние значения UITextFields, если пользователь обновит одно перед нажатием кнопки.

Вы можете справиться с этим одним из двух способов.


Используйте вычисляемое свойство:

Если вы превратите 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 из textFields. Этот массив будет создан при первом обращении к нему, но, поскольку он содержит объекты, у вас всегда будет доступ к последним входным значениям от пользователя.

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
    }
}
person vacawama    schedule 20.07.2019
comment
Ваш convert_to_double(input1: str) эквивалентен Double(str)!, поэтому он не добавляет много. Вам следует избегать принудительного разворачивания вещей, которые находятся вне вашего контроля. Вы можете использовать оператор объединения nil, чтобы задать значение по умолчанию в случае, если пользовательский ввод не преобразуется в Double: например, Double(textFields[a].text!) ?? 0. - person vacawama; 20.07.2019
comment
convert_to_double (input1: str) это не имело смысла, как вы сказали, но в свою защиту я собирался добавить больше кода, чтобы проверить, были ли определенные символы типизированы. В итоге я использовал Double (textFields [a] .text!) ?? 0. Спасибо . Теперь я пытаюсь напечатать двойники внутри чисел - person Pep3; 20.07.2019
comment
@ Pep3, это ответ на ваш вопрос? Если да, примите его, нажав на серую галочку слева, чтобы она стала зеленой. - person vacawama; 22.07.2019
comment
Большое спасибо! он сделал, но если у вас есть время, вы также можете показать мне, как я буду обновлять некоторые метки или просто распечатывать числа, чтобы убедиться, что ввод текстового поля преобразован в double, а затем помещен в массив чисел. - person Pep3; 22.07.2019
comment
Вы можете добавить операторы печати в ключевые моменты вашего кода, и они будут выводиться на консоль. Кроме того, вы можете устанавливать точки останова и шаг за шагом просматривать прогресс вашего кода. - person vacawama; 22.07.2019
comment
Я сделал: напечатал (числа [a]) поверх + = 1, но иногда это приводит к сбою приложения или что-то говорит о том, что Init не может что-то или какая-то ошибка потока, но я думаю, что со временем я это выясню. Не пытаюсь вас беспокоить. - person Pep3; 22.07.2019
comment
Найдите ошибки в Google, и вы, вероятно, найдете полезный ответ здесь, в StackOverflow. Возможно, вы захотите использовать append для создания массива numbers. - person vacawama; 22.07.2019
comment
Я пробовал разные способы и гуглил разные ошибки, я продолжаю добиваться прогресса, но когда я гуглию ошибки, я просто думаю о том, как много я не знаю о разработке приложений. Спасибо еще раз - person Pep3; 22.07.2019
comment
Нам нужно знать больше, чем любой из нас когда-либо узнает. Продолжайте подключаться к сети. Становится легче. - person vacawama; 22.07.2019