如何修复 "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
您正在尝试使用索引值访问用户的输入。创建文本输入值数组有两个问题:
- 在您的情况下,您不能使用 属性 初始值设定项创建此数组,因为
self
在 之后才可用 class 已经完全初始化。
- 创建用户输入数组将是静态的,如果用户在按下按钮之前更新了
UITextField
s,则不会显示最新值。
您可以通过以下两种方式之一处理此问题。
使用计算属性:
如果您将 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
}
}
创建UITextFields
的lazy var
:
创建 textFields
的 lazy
数组。该数组将在第一次访问时创建,但由于它包含对象,您将始终可以访问用户的最新输入值。
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
}
}
我的编译器没有显示任何问题,但在 运行 时,我收到了一个未知错误。我正在尝试将 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
您正在尝试使用索引值访问用户的输入。创建文本输入值数组有两个问题:
- 在您的情况下,您不能使用 属性 初始值设定项创建此数组,因为
self
在 之后才可用 class 已经完全初始化。 - 创建用户输入数组将是静态的,如果用户在按下按钮之前更新了
UITextField
s,则不会显示最新值。
您可以通过以下两种方式之一处理此问题。
使用计算属性:
如果您将 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
}
}
创建UITextFields
的lazy var
:
创建 textFields
的 lazy
数组。该数组将在第一次访问时创建,但由于它包含对象,您将始终可以访问用户的最新输入值。
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
}
}