EXC_BAD_INSTRUCTION(代码= EXC_I386_INVOP,子代码= 0x0)

时间:2015-11-18 05:08:36

标签: swift compiler-errors exc-bad-instruction

我正在创建一个温度转换器。当我运行应用程序时;输入温度,选择转换并单击转换。出现错误。 错误是:EXC_BAD_INSTRUCTION(代码= EXC_I386_INVOP,子代码= 0x0)

这是我的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.
}
}

这是我收到错误的地方。 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
        }

    }
}
}

我不知道我做错了什么。我想检查labelConvertFrom中的文本并检查它是否等于“Celsius”。如果没有,则返回答案。

我真的很感激任何人的帮助。谢谢!

2 个答案:

答案 0 :(得分:2)

问题大多源于class TempConvert中的这一行:

var view = ViewController()

这里是初始化一个空视图控制器。您定义的商店(例如labelConvertFrom)并未与任何商品挂钩,因此当您尝试在此处推荐它们时:

view.labelConvertFrom.*text

你崩溃了(具体来说,你把我放*字符的地方崩溃了)。您崩溃的原因是因为此时labelConvertFromnil

为了使其正常工作,您需要使用initWithNibName:bundle:方法初始化ViewController,传递正确的nib文件名和包ID(可能只是NSBundle.mainBundle())。< / p>

执行此操作可以让您的网点正确连接,然后当您尝试使用它们时,它们将不会nil

答案 1 :(得分:2)

正如par所指出的那样,您应该移除封闭的extension ViewController { }并将TempConvert作为单独的类。

此外,您应该在ViewController类本身的TempConvert方法中进行比较,而不是尝试访问convertButton()中的ViewController实例变量。在TempConvert类中调用适当的转换方法。

更好的方法是在ViewController类中为“Celsius”存储属性并为“Fahrenheit”计算属性。您可以将此link引用为Swift语言中的属性