SWIFT 4 - Невозможно преобразовать значение типа 'UITextField!' к ожидаемому типу аргумента 'Double' - PullRequest
0 голосов
/ 25 августа 2018

Я пытаюсь создать эту базовую формулу кривизны земли, она работает на игровой площадке, но у меня возникают трудности с получением расстояния от UITextField, от раскадровки типа строки в Double, чтобы ее можно было рассчитать , Я пытался унизить и среди прочего, и до сих пор не могу заставить его работать.

class ViewController: UIViewController {

// MARK: - IBOutlets

@IBOutlet weak var distanceTextField: UITextField! // Distance from point A to B in miles from textField
@IBOutlet weak var targetHiddenInFeet: UILabel! // Result of earth curvature formula displayed in Label

// MARK: - Variables and Contsants

let inchPerMile : Double = 8 // inch drop per mile (Never changes)


// MARK: - IBActions

@IBAction func calculateButtonPressed(_ sender: UIButton) {

let distanceSquared : Double = pow(distanceTextField,2)
let curvatureFormula : Double = inchPerMile * distanceSquared
let convertionInFeet : Double = curvatureFormula / 12
let roundedNumber = String(format: "%.2f", convertionInFeet)

    print(roundedNumber)
    return targetHiddenInFeet.text = roundedNumber

}

Press for Screenshot

Ответы [ 2 ]

0 голосов
/ 25 августа 2018

Основная ошибка в том, что вы пытаетесь преобразовать UITextField объект в число, но вы должны получить значение из текстового ввода через text accessor .Примерно так: let distanceSquared : Double = pow(distanceTextField.text, 2).

Второе, свойство text является необязательным, поэтому лучше проверить, что у вас есть значение, например, с оператором guard.Примерно так guard let distance = distanceTextField.text else { return } в начале func calculateButtonPressed(...).В случае пустого ввода ваша функция не будет выполнена (обычно это называется «ранний возврат»).

В-третьих, рекомендуется проверять, является ли текст действительным числом (Double * 1015).* function возвращает необязательное значение, если вы передаете String, и оно равно nil, если входное значение не является числом), поэтому окончательное решение может выглядеть примерно так:

@IBAction func calculateButtonPressed(_ sender: UIButton) {
    guard let distance = Double(distanceTextField.text) else { return }
    let distanceSquared : Double = pow(distance, 2)
    let curvatureFormula : Double = inchPerMile * distanceSquared
    let convertionInFeet : Double = curvatureFormula / 12
    let roundedNumber = String(format: "%.2f", convertionInFeet)

    print(roundedNumber)
    targetHiddenInFeet.text = roundedNumber
}

PS Кроме того, я удалилreturn оператор в конце функции, потому что в этом нет необходимости (ваша функция возвращает Void по умолчанию).

Удачного кодирования!

0 голосов
/ 25 августа 2018

Сначала вы должны получить текст из TextField

distanceTextField.text

Затем, чтобы преобразовать это в двойное число, вы можете использовать инициализатор типа, например, так:

Double(distanceTextField.text)

Итак, строка, которая гласит

let distanceSquared : Double = pow(distanceTextField,2)

станет

let distanceSquared : Double = pow(Double(distanceTextField.text), 2)

Поскольку эта инициализация может завершиться ошибкой, если введенный текст не может быть преобразован в Double, приведенный ниже код обеспечит безопасность

if let distance = Double(distanceTextField.text!) {
  let distanceSquared : Double = pow(distance, 2)
} else {
  //failed to convert textfield text to a double
}
...