2016-03-30 6 views
3

Итак, я рассмотрел все другие вопросы, касающиеся этого, и я попытался реализовать предлагаемые решения, но безуспешно. У меня есть два текстовых поля в контроллере представления, в которые пользователь вводит числа, и тогда ему разрешено выполнять сложение или вычитание двух чисел. Если я не ошибаюсь, текстовые поля являются строками и должны быть преобразованы в целые числа до того, как будет выполнен расчет. Однако мне не повезло с этим преобразованием. Любые предложения в правильном направлении будут высоко оценены. Здесь применяется код:Преобразование из строки в int в Swift

let firstInput : Int? = Int(firstNumber) 
let secondInput : Int? = Int(secondNumber) 
var result = 0 

@IBOutlet weak var firstNumber: UITextField! 

@IBOutlet weak var secondNumber: UITextField! 

@IBOutlet weak var segmentedControlCalculate: UISegmentedControl! 

@IBAction func segmentedControlAddSubtract(sender: AnyObject) { 
    switch segmentedControlCalculate.selectedSegmentIndex { 
    case 0: 
     result = firstInput+ secondInput 
    case 1: 
     result = firstInput - secondInput 
    default: 
     return 
    } 
    updateTotalLabel() 

} 

func updateTotalLabel() { 
    total.text = "Total = " + String(result) 
} 

@IBOutlet weak var total: UILabel! 

@IBAction func dismiss(sender: AnyObject) { 
    dismissViewControllerAnimated(true, completion: nil) 
} 
+0

Это помогло мне ................ –

ответ

4

Текстовое поле содержит строку (в свой text); он сам не является строкой. И поскольку эта строка может измениться, вы должны спросить текстовое поле для нее каждый раз, когда вам это нужно.

Вы можете использовать guard let заявление разворачивать все дополнительные опции (поскольку каждый из текстового поля text не являются обязательными, а Int преобразования также возвращает опционально), например:

class ViewController { 
    @IBOutlet weak var firstNumber: UITextField! 
    @IBOutlet weak var secondNumber: UITextField! 
    @IBOutlet weak var total: UILabel! 
    @IBOutlet weak var segmentedControlCalculate: UISegmentedControl! 

    @IBAction func segmentedControlAddSubtract(sender: AnyObject) { 
     switch segmentedControlCalculate.selectedSegmentIndex { 
     case 0: 
      operation = (+) 
     case 1: 
      operation = (-) 
     default: 
      return 
     } 
     updateTotalLabel() 
    } 

    private var operation: ((Int, Int) -> Int)? 

    private func updateTotalLabel() { 
     guard let operation = operation, 
      firstString = firstNumber.text, 
      firstInput = Int(firstString), 
      secondString = secondNumber.text, 
      secondInput = Int(secondString) 
      else { 
       total.text = "Bogus input" 
       return 
     } 
     let result = operation(firstInput, secondInput) 
     total.text = "Total = \(result)" 
    } 
} 
1

Таким образом, вы должны понимать, что это несоответствие типа на строку в целое больше, то из междунар обугливаться. Во время преобразования вы можете потерять некоторые биты, но, насколько я понимаю, мы толкнули его на использование :) Для использования в качестве целого u может просто инициализировать новый var с помощью конструктора.

var string = "1234" 
var number = Int(string) 

Вы должны проверить тип возврата входов свойств, если это строка. Попробуйте выделить строки, а затем преобразовать, потому что, может быть, вы повторно преобразовать свойство объекта, но не данные :)

+0

Это не работает, потому что строка firstNumber или secondNumber, которые вводятся пользователем. Выполнение: var firstInput = Int (firstNumber) var secondInput = Int (secondNumber) не работает. – MatthewSpire

+0

Вы должны проверить тип возврата входов свойств, если это строка. Попытайтесь изолировать строки, а затем конвертировать, потому что, возможно, вы переопределяете свойство объекта, но не данные :) –

1

Ваш расчет часть должна быть, как это

@IBAction func segmentedControlAddSubtract(sender: AnyObject) { 

    // You should assign value in this stage, because there might still no value for textfield initially. 
    firstInput = Int(firstNumber.text) 
    secondInput = Int(secondNumber.text) 

    switch segmentedControlCalculate.selectedSegmentIndex { 
    case 0: 
     result = firstInput+ secondInput 
    case 1: 
     result = firstInput - secondInput 
    default: 
     return 
    } 
    updateTotalLabel() 

} 

Вы должны назначить переменную внутри действия, а не на начало

+0

Хорошо, но когда я иду нажимать на одну часть сегментированного контроллера, метка не обновляется. Есть предположения? – MatthewSpire

+0

Вы пытаетесь проверить debug, если он запущен в ваш 'updateTotalLabel()'. Также можно «распечатать» или «NSLog», если результат верный, потому что я вижу, что у вас есть 'IBOutlet' для общего количества, и это должно быть правильно, если только соединение общего номера не имеет некоторого прогиба – Lee

3
let text1 = "4" 
    let text2 = "3" 
    let a = Int(text1) //4 
    let b = Int(text2) //3 
    let c = a! + b! //7 

    print(a) //"Optional(4)\n" 
    print(c) //7 

Обязательно разворачиваются. Преобразование строки в Int может не привести к Int и, следовательно, тип является необязательным. Конечно, это простой пример. Вам нужно сначала проверить, был ли введен реальный Int.

+0

Спасибо! Это спасло мое время. – Raja