Search code examples
swiftcompiler-errorsexc-bad-instruction

EXC_BAD_INSTRUCTION (code = EXC_I386_INVOP, subcode=0x0)


I'm creating a temperature converter. When I run the application; enter a temperature, select which conversion and click convert. An error comes up. THE ERROR IS: EXC_BAD_INSTRUCTION (code = EXC_I386_INVOP, subcode=0x0)

This is my code for ViewController:

import UIKit

class ViewController: UIViewController,UIPickerViewDataSource,UIPickerViewDelegate {

@IBOutlet weak var orginalValue: UITextField!

@IBOutlet weak var convertFrom: UIPickerView!
let pickerData = ["Celsius", "Fahrenheit"]

override func viewDidLoad() {
    super.viewDidLoad()
    convertFrom.dataSource = self
    convertFrom.delegate = self
}

@IBOutlet weak var labelConvertFrom: UILabel!

@IBOutlet weak var convertTo: UIPickerView!

@IBOutlet weak var labelConverTo: UILabel!

@IBOutlet weak var answer: UILabel!

@IBAction func convertButton(sender: AnyObject) {
    let a = Double(orginalValue.text!)
    let tempConvertM = TempConvert(temp: a!)
    answer.text = String(tempConvertM.convert())

}

func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
    return 1
}
func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
    return pickerData.count
}

func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
    return pickerData[row]
}

func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
    labelConvertFrom.text = pickerData[row]
}



override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}
}

Here is where I'm getting the error. TempConverterModel.swift

 import Foundation

 extension ViewController{
 class TempConvert{

    var temp:Double
    var view = ViewController()

    init (temp:Double){
        self.temp = temp
    }

    func convert()->Double{
        if(view.labelConvertFrom.text == "Celsius"){ -->ERROR IS HIGHLIGHTED HERE <--
           view.labelConverTo.text = "Fahrenheit"
           return (temp-32)/1.8000; //fahrenheit formula
        }
        else{
            view.labelConverTo.text = "Celsius"
            return (temp*1.8000)+32; //celsius formula
        }

    }
}
}

I don't know what I'm doing wrong. I want to check the text in labelConvertFrom and check if it equals to "Celsius". IF it does not then return answer.

I would really appreciate anyones help. Thank you!


Solution

  • As par pointed out, you should be removing the enclosing extension ViewController { } and have your TempConvert as a separate class.

    Also, instead of trying to access the ViewController's instance variables in TempConvert, you should be doing the comparisons in your convertButton() method in ViewController class itself and call the appropriate conversion method in TempConvert class.

    A better approach is to have a stored property for "Celsius" and a computed property for "Fahrenheit" within your ViewController class. You can refer this link for Properties in Swift language