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

EXC_BAD_INSTRUCTION (code = EXC_I386_INVOP, subcode=0x0)

我正在创建一个温度转换器。当我运行申请时;输入一个温度,select 转换并点击转换。出现错误。 错误是: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"。如果没有,则 return 回答。

非常感谢任何人的帮助。谢谢!

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

var view = ViewController()

这里您正在初始化一个空的视图控制器。您定义的出口,例如 labelConvertFrom 没有连接到任何东西,所以当您尝试在此处尊重它们时:

view.labelConvertFrom.*text

你崩溃了(具体来说,你在我放置 * 字符的地方崩溃了)。你崩溃的原因是因为那时 labelConvertFromnil.

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

这样做可以让您的插座正确连接,然后当您尝试使用它们时它们将不会 nil

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

此外,与其尝试在 TempConvert 中访问 ViewController 的实例变量,不如在 ViewController 中的 convertButton() 方法中进行比较 class 本身并在 TempConvert class 中调用适当的转换方法。

更好的方法是在 ViewController class 中为 "Celsius" 存储 属性 并为 "Fahrenheit" 计算 属性 .您可以在 Swift 语言

中参考此 link 属性