EXC_BAD_INSTRUCTION (код = EXC_I386_INVOP, субкод = 0x0)

Я создаю преобразователь температуры. Когда я запускаю приложение; введите температуру, выберите преобразование и щелкните преобразовать. Выскакивает ошибка. ОШИБКА: 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 и проверить, соответствует ли он «Цельсию». ЕСЛИ он не возвращает ответ.

Я был бы очень признателен за любую помощь. Спасибо!


person Marcella Ruiz    schedule 18.11.2015    source источник


Ответы (2)


Как указано в par, вам следует удалить закрывающий extension ViewController { } и сделать свой TempConvert отдельным классом.

Кроме того, вместо того, чтобы пытаться получить доступ к переменным экземпляра ViewController в TempConvert, вы должны выполнять сравнения в своем convertButton() методе в самом классе ViewController и вызывать соответствующий метод преобразования в классе TempConvert.

Лучше всего иметь сохраненное свойство для «Цельсия» и вычисляемое свойство для «Фаренгейта» в вашем ViewController классе. Вы можете обратиться к этой ссылке для свойств в Быстрый язык

person R P    schedule 18.11.2015
comment
Это сработало. Я сделал, как вы сказали, и провел сравнения в convertButton. БОЛЬШОЕ СПАСИБО! - person Marcella Ruiz; 18.11.2015
comment
Если это сработало для вас, вы можете отметить это как ответ :) - person R P; 18.11.2015

Проблема в целом проистекает из этой строки в class TempConvert:

var view = ViewController()

Здесь вы инициализируете пустой контроллер представления. Выходы, которые вы определили, например labelConvertFrom, ни к чему не подключены, поэтому, когда вы попытаетесь почтить их здесь:

view.labelConvertFrom.*text

происходит сбой (в частности, сбой там, где я поместил символ *). Причина сбоя в том, что в этот момент labelConvertFrom равно nil.

Чтобы это работало правильно, вам необходимо инициализировать ViewController с помощью метода initWithNibName:bundle:, передав правильное имя файла пера и идентификатор пакета (который, вероятно, равен NSBundle.mainBundle()).

Это позволит правильно подключить ваши розетки, и тогда они не будут nil, когда вы попытаетесь их использовать.

person par    schedule 18.11.2015
comment
Мои извенения. Я новичок в Swift, и это мое первое приложение с iOS, которое я не совсем понимаю. Как инициализировать ViewController? Сделал бы я это в классе ViewController или в TempCovert? - person Marcella Ruiz; 18.11.2015
comment
let viewController = UIViewController(nibName: "mynibfile.xib", bundle: NSBundle.mainBundle()) ... конечно, замените параметр nibName на фактическое имя вашего файла с перьями. - person par; 18.11.2015
comment
Вы можете сделать это в TempConvertclass. И еще одно примечание: это не имеет особого значения с точки зрения его работы, но класс TempConvert не должен быть классом расширения UIViewController. Просто поместите его в отдельный файл TempConvert.swift и удалите заключительный extension UIViewController {} - person par; 18.11.2015
comment
Означает ли это, что мне нужно создать файл с перьями? Я не вижу своих файлов с расширением .xib - person Marcella Ruiz; 18.11.2015
comment
Я очень ценю вашу помощь, Пар. - person Marcella Ruiz; 18.11.2015
comment
Да, вам понадобится файл с перьями или раскадровка. Начните с нового проекта Swift в Xcode, и ViewController будет уже настроен для вас. Поместите в него свой код, и он должен начать работать. В качестве альтернативы вы можете настроить каждое поле программно (вручную), но я не рекомендую это делать, если вы только начинаете. - person par; 18.11.2015
comment
Давайте продолжим это обсуждение в чате. - person Marcella Ruiz; 18.11.2015