Ипотечный калькулятор Swift

#swift

#swift

Вопрос:

Я новичок в Xcode и Swift. Ниже приведена моя формула для ипотечного калькулятора. Он работает правильно на игровой площадке, но когда я переношу его на вкладку ViewController, именно тогда Xcode выдает мне кучу ошибок. Может кто-нибудь, пожалуйста, помочь?

 let r: Double = interestRate / 1200
let n: Double = years * 12
let p: Double = pow(1   r, n)


let monthPay = loan * r * p / (p - 1)
print(monthPay)
  

Итак, на мой взгляд, контроллер
ValueA — это сумма кредита
, ValueB — количество платежей
, valueC — процентная ставка

под ним у вас будет кнопка «Рассчитать», которая выведет результаты внизу в ярлыке с текущим именем «Результаты». Возможно, когда я переименовываю все в значения, возникают проблемы.

Код ViewController

 import UIKit
class ViewController: UIViewController {
    @IBOutlet weak var valueA: UITextField!
    @IBOutlet weak var valueB: UITextField!
    @IBOutlet weak var valueC: UITextField!
    @IBOutlet weak var results: UILabel!
    override func viewDidLoad() {
        super.viewDidLoad()
    }
    @IBAction func button(_ sender: Any) {
        let a = Int(valueA.text!)
        let b = Int(valueB.text!)
        let c = Int(valueC.text!)
        let answer = a! * c! * pow(1   c!, b!) / (pow(1   c!, b!))
        results.text = "$(answer)"
    }
}
  

Ответ №1:

Ваша проблема заключается в том, что вы преобразуете значения текстового поля в целые числа и пытаетесь умножить их на результат метода pow, который возвращает Double . Обратите внимание, что если пользователь введет неверное значение, ваше приложение завершит работу, если вы принудительно развернете результат. Вы можете использовать оператор объединения nil ?? для предоставления значения по умолчанию .zero в случае сбоя. Попробуйте вот так:

 class ViewController: UIViewController {
    @IBOutlet weak var valueA: UITextField!  // loan amount
    @IBOutlet weak var valueB: UITextField!  // Number of Payments
    @IBOutlet weak var valueC: UITextField!  // Interest Rate
    @IBOutlet weak var results: UILabel!
    override func viewDidLoad() {
        super.viewDidLoad()
    }
    @IBAction func button(_ sender: Any) {
        let loanAmount = Double(valueA.text!) ?? .zero
        let numberOfPayments = Double(valueB.text!) ?? .zero
        let interestRate = Double(valueC.text!) ?? .zero
        let rate = interestRate / 100 / 12
        let answer = loanAmount * rate / (1 - pow(1   rate, -numberOfPayments))
        results.text = Formatter.currency.string(for: answer)
    }
}
  

 extension Formatter {
    static let currency: NumberFormatter = {
        let formatter = NumberFormatter()
        formatter.locale = .init(identifier: "en_US_POSIX")
        formatter.numberStyle = .currency
        return formatter
    }()
}
  

Комментарии:

1. Спасибо! Будет ли это также под кнопкой IBAction func? пусть r: Double = проценты / 1200 пусть n: Double = годы * 12 пусть Pow: Double = pow (1 r, n) Я также предполагаю, что для меня это будет пусть c: Double = процентная ставка / 1200 пусть b: Double = годы * 12 пусть Pow: Double = pow(1 c, b)

2. @DylanWilliams при написании кода в Swift вы всегда должны называть свои переменные описательными именами. Избегайте, насколько это возможно, таких имен, как a, b, c, если вы не называете координаты, такие как x, y

3. r будет формулой процентной ставки для помощи с ипотекой, n будет формулой платежа, p будет функцией Pow

4. Я бы предположил, что это не лучший способ работы с формулой ипотеки в swift

5. Лично я бы просто использовал 0 вместо .zero .