Что означает «не может вызывать инициализатор для типа« Int »с списком аргументов типа« UITextField »?

В моем приложении у меня строка кода lrs24 = (30 * Int(weight)! + 70) * Int(factor)!; , Кажется, все в порядке, но компилятор говорит, что он «не может вызывать инициализатор для типа« Int »с списком аргументов типа« UITextField ». Что это значит и как я могу это исправить? Благодаря!

PS- Вот все мои коды-

 import UIKit class ViewController: UIViewController, UITextFieldDelegate { @IBOutlet weak var animalNum: UITextField! @IBOutlet weak var logLabel: UILabel! @IBOutlet weak var resetButton: UIButton! @IBOutlet weak var weight: UITextField! @IBOutlet weak var deh: UITextField! @IBOutlet weak var losses: UITextField! @IBOutlet var factor: [UITextField]! @IBOutlet weak var lrs24: UILabel! override func viewDidLoad() { super.viewDidLoad() // Handle the text field's user input through delegate callbacks. animalNum.delegate = self } // MARK: UITextFieldDelegate func textFieldShouldReturn(textField: UITextField) -> Bool { // Hide the keyboard. textField.resignFirstResponder() return true } func textFieldDidEndEditing(textField: UITextField) { logLabel.text = textField.text } // MARK: Actions @IBAction func setDefaultLabelText(sender: UIButton) { logLabel.text = "Default Text" } @IBAction func textFieldsDidEndEditing(sender: AnyObject) { lrs24 = (30 * Int(weight)! + 70) * Int(factor)!; //+ Int(weight)! * Int(deh)! * 10 + Int(losses)! //(30 * &weight + 70) * &factor + &weight * &deh * 10 + &losses } } 

Ошибка в том, что она говорит: вы не можете использовать UITextField в качестве аргумента при инициализации Int

Вот код, который вы используете в своей функции textFieldsDidEndEditing

 lrs24 = (30 * Int(weight)! + 70) * Int(factor)! ^ ^ ^ ^ ^ ^ ^ ^ | | | | | | | | Defined as a UITextField! | | | | Defined as a [UITextField]! 

Вы пытаетесь сказать Swift создать новое целое число, Int() . Чтобы создать целое число, вы даете Swift текстовое поле, weight и factor . Где Swift должен получать целочисленное значение? UITextField не является целым числом.

Чтобы представить это в перспективе, это похоже на попытку превратить яблоко в апельсин – это невозможно сделать (если у вас нет темной магии, но это другой вопрос). Подобная идея применяется к этому – вы не можете повернуть поле, где пользователь может вводить текст в число. Это просто не работает!

Тем не менее, вы можете преобразовать строку, например, в целое число, поскольку оно содержит данные, с которыми можно инициализировать целое число. Например, довольно просто превратить строку "7901" в число с помощью Int("7901") потому что вы даете данные Swift, чтобы она могла превратиться в целое число.

Если вы хотите получить текст, который был введен в текстовое поле, вы должны использовать переменную UITextField.text . Например, чтобы ввести число, введенное в поле weight , вы можете использовать

 //This should only be used if you are 100% sure that the text will be a number //If it isn't, using this code, the app will crash var weightInteger: Int = Int(weight.text)! //If you aren't 100% sure the input will be a number, you should use var weightInteger: Int = Int(weight.text) ?? 0 

Вы сможете это сделать из-за указанной выше инициализации Int с помощью String

Я бы также предположил, что factor переменная не должна быть [UITextField]! , который является массивом (или списком) UITextFields . Вместо этого, вероятно, это UITextField! (конечно, я могу ошибаться, и вы действительно можете хранить список UITextFields в этой переменной, и в этом случае вам нужно будет использовать цикл for для получения значений в списке.

Если вы хотите установить текст метки, вы должны использовать UILabel.text – вы не можете просто установить UILabel в строку.

Итак, в конце концов, предполагая, что этот factor должен быть UITextField! а не [UITextField]! , вы должны использовать

 let value: Int = (30 * (Int(weight.text) ?? 0) + 70) * (Int(factor.text) ?? 0) //You may want to change the last bit //(Int(factor.text) ?? 0) to (Int(factor.text) ?? 1) //Which would set the factor to "1" instead of "0" //if a non-integer or nothing is inputed lrs24.text = "\(value)" //this sets the text of the label to //the value above. It has to be in the format //"\(x)" because we have to turn x into a String. //If you prefer, you could also use String(x) //which would be String(value) in this example //that's personal preference, though 

Кроме того, хотя это не имеет ничего общего с исходным вопросом, вот некоторые вещи, которые вы должны сделать для своего кода, чтобы сделать его лучше

  • Вам не нужен ; в конце строки – Swift автоматически завершает линии для вас
  • Вам следует избегать принудительного развертывания (оператора ! ), Если вы не уверены, что значение не будет равно нулю. Вместо использования Int(x)! , вы должны использовать Int(x) ?? 0 Int(x) ?? 0 , которое вместо сбоя дает значение «0», если инициализированное целое число равно nil .
  • Как создать оповещение в классе subview в Swift?
  • Как я могу отклонить модальный сегмент, а затем выполнить push segue в новый контроллер вида
  • Swift UITableView удаляет выбранную строку и любые строки над ней
  • Как установить фоновое изображение в Xcode с помощью swift?
  • скор. AVPlayer. Как отслеживать воспроизведение песни?
  • В чем разница между свойствами: numberOfObjects и objects !.count в разделе NSFetchedResultsController?
  • Неожиданно найдено nil при разворачивании дополнительного значения
  • Multi-Sampling / Jagged Edges in Metal (iOS)
  • Как рассчитать высоту таблицы динамически?
  • Swift - лить нулевую базовую строку данных в качестве необязательного значения
  • Динамический тип и саморазмерные ячейки со статической таблицей
  • Давайте будем гением компьютера.