Xcode, Swift 4
How do I pass data to another view controller in Swift 4?
Below is my code and I am getting an error message.
I am getting an error on line 181. It says
Cannot assign value of type 'DataToPass' to type 'ViewController'
struct DataToPass {
var principal: Double = 0
var balance: Double = 0
var monthlyInterest: Double = 0
var paymentNumber: Int = 0
}
class ViewController: UIViewController, UITextFieldDelegate, UITextViewDelegate {
var valueToPass: DataToPass = DataToPass(principal: 0.00, balance: 0.00, monthlyInterest: 0.00, paymentNumber: 0)
// Class-level constant to hold the months per year.
let dblMONTHS_YEAR: Double = 12
// To not allow more than 1 decimal point.
func textField(_ textField: UITextField,shouldChangeCharactersIn range: NSRange,replacementString string: String) -> Bool
{
let countdots = (textField.text?.components(separatedBy: ".").count)! - 1
if countdots > 0 && string == "."
{
return false
}
return true
}
@IBAction func textFieldCost(_ sender: TextField) {
func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
self.view.endEditing(true)
}
}
@IBAction func textFieldDownPayment(_ sender: TextField) {
func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
self.view.endEditing(true)
}
}
@IBAction func textFieldMonths(_ sender: TextField) {
func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
self.view.endEditing(true)
}
}
@IBAction func textFieldAPR(_ sender: TextField) {
func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
self.view.endEditing(true)
}
}
@IBOutlet weak var txtViewLabels: UITextView!
@IBOutlet weak var txtViewResults: UITextView!
// Text Field Outlets.
@IBOutlet weak var txtCost: UITextField!
@IBOutlet weak var txtDownPayment: UITextField!
@IBOutlet weak var txtMonths: UITextField!
@IBOutlet weak var txtAPR: UITextField!
// Error Message.
@IBOutlet weak var lblMessage: UILabel!
// Buttons
@IBAction func btnCalculate(_ sender: UIButton) {
var dblAPR: Double = 0 // To hold the Annual Rate.
var dblTotalAmount: Double = 0 // To hold the vehicle total cost.
var dblCost: Double = 0 // To hold vehicle cost.
var dblDownPayment: Double = 0 // To hold down payment.
var intMonths: Int = 0 // To hold number of months for the loan.
var dblLoan: Double = 0 // To hold the amount of the loan.
var dblMonthlyPayment: Double = 0 // To hold the monthly payment.
var dblTotalInterest: Double = 0 // To hold the total interest.
var dblMonthlyRate: Double = 0 // To hold the monthly Rate.
var monthlyInterest: Double = 0
var balance: Double = 0
var principal: Double = 0
var paymentNumber: Int = 0
var data: [String] = []
func passedValue() {
func paymentStructure() {
data = []
balance = dblLoan
for _ in 1...intMonths {
paymentNumber+=1
dblCost = Double(txtCost.text!)!
dblDownPayment = Double(txtDownPayment.text!)!
intMonths = Int(txtMonths.text!)!
dblAPR = Double(txtAPR.text!)!
monthlyInterest = balance * ((dblAPR/100)/12)
principal = dblMonthlyPayment - monthlyInterest
balance = balance - principal
let fPrincipal = NSNumber(value: principal)
let fResultPrincipal = NumberFormatter.localizedString(from: fPrincipal, number: .currency)
let fBalance = NSNumber(value: balance)
let fResultBalance = NumberFormatter.localizedString(from: fBalance, number: .currency)
let fMonthlyInterest = NSNumber(value: monthlyInterest)
let fResultMonthlyInterest = NumberFormatter.localizedString(from: fMonthlyInterest, number: .currency)
data += ["\(paymentNumber). P: \(fResultPrincipal), I: \(fResultMonthlyInterest), B: \(fResultBalance)"]
}
valueToPass.paymentNumber = intMonths
valueToPass.monthlyInterest = monthlyInterest
valueToPass.principal = principal
valueToPass.balance = balance
}
}
else if txtCost.text != nil && txtDownPayment.text != nil && txtMonths.text != nil && txtAPR.text != nil {
// Clear the message.
lblMessage.text = ""
dblCost = Double(txtCost.text!)!
dblDownPayment = Double(txtDownPayment.text!)!
intMonths = Int(txtMonths.text!)!
dblAPR = Double(txtAPR.text!)!
// Get the APR rate.
dblAPR = dblAPR / 100
// Get the monthly rate.
dblMonthlyRate = dblAPR / dblMONTHS_YEAR
// Get the monthly payment.
dblMonthlyPayment = (dblCost - dblDownPayment) * (dblMonthlyRate / (1 - pow(1 + dblMonthlyRate, Double(-intMonths))))
// Get the amount of the loan.
dblLoan = dblCost - dblDownPayment
// Get the total interest.
dblTotalInterest = dblMonthlyPayment * Double(intMonths) - dblLoan
// Get the Total Amount.
dblTotalAmount = dblCost + dblTotalInterest
// Get the Vehicle Cost.
dblCost = dblTotalAmount - dblTotalInterest
// Format the results.
let fCost = NSNumber(value: dblCost)
let fResultCost = NumberFormatter.localizedString(from: fCost, number: .currency)
let fDownPayment = NSNumber(value: dblDownPayment)
let fResultDownPayment = NumberFormatter.localizedString(from: fDownPayment, number: .currency)
let fLoan = NSNumber(value: dblLoan)
let fResultLoan = NumberFormatter.localizedString(from: fLoan, number: .currency)
let fMonthlyPayment = NSNumber(value: dblMonthlyPayment)
let fResultMonthkyPayment = NumberFormatter.localizedString(from: fMonthlyPayment, number: .currency)
let fAPR = NSNumber(value: dblAPR)
let fResultAPR = NumberFormatter.localizedString(from: fAPR, number: .percent)
let fTotalInterest = NSNumber(value: dblTotalInterest)
let fResultTotalInterest = NumberFormatter.localizedString(from: fTotalInterest, number: .currency)
let fTotalAmount = NSNumber(value: dblTotalAmount)
let fResultTotalAmount = NumberFormatter.localizedString(from: fTotalAmount, number: .currency)
txtViewLabels.text = " APR:\n Months: \n Cost:\n Down Payment:\n Loan Amount:\n Monthly Payment:\n Total Interest:\n Total Amo
txtViewResults.text = " \(fResultAPR)\n \(intMonths)\n \(fResultCost)\n \(fResultDownPayment)\n \(fResultLoan)\n \(fResultMonthkyPayment)\n \(fResultTotalInterest)\n \(fResultTotalAmount)"
passedValue()
}
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "payout structure" {
if let destVC = segue.destination as? PayoutStructure {
destVC.passedData = valueToPass
}
}
}
}