2016-03-30 18 views
3

私はこれに関する他のすべての質問を見てきましたが、私は提案されたソリューションを実装しようとしましたが、役に立たなかった。私は、ユーザーが数字を入力し、2つの数字の加算または減算のどちらかを実行することを許可されているビューコントローラーに2つのテキストフィールドを持っています。私が間違っていない限り、テキストフィールドは文字列であり、計算を行う前に整数に変換する必要があります。私はそのコンバージョンに幸運はありません。正しい方向への提案は非常に高く評価されます。ここで該当のコードは次のとおりです。Swiftの文字列からintへの変換

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プロパティ)が含まれています。それ自体は文字列ではありません。その文字列は変更可能なので、必要なときに毎回テキストフィールドにそれを尋ねる必要があります。

あなたはこのように、(各テキストフィールドのtextは任意であり、そしてInt変換はまた、オプションを返すので)optionalsのすべてをアンラップするguard letステートメントを使用することができます。

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

だから、あなたはそれがintに文字列に不一致を入力するのです理解しなければならないことはをcharにint型の、より多くのです。 変換中にいくつかのビットが緩んでいるかもしれませんが、私が理解するように、それを使用するようにプッシュしました。 整数として使用する場合、uはコンストラクタで新しいvarを初期化できます。

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

プロパティ入力の戻り値の型をチェックする必要があります。文字列を分離して、変換しよう、多分あなたは再びあなたの演算部は、あなたがでアクション内のあなたの変数を割り当てる、とはならない。この

@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

文字列がfirstNumberまたはsecondNumberなので、これは動作しません。これはユーザーが入力したものです。実行: var firstInput = Int(firstNumber) var secondInput = Int(secondNumber) は機能しません。 – MatthewSpire

+0

プロパティの入力の戻り値の型をチェックする必要があります(文字列の場合)。 –

1

を変換するため、最初は

+0

いいえ、セグメント化されたコントローラのいずれかの部分を押すと、ラベルが更新されません。何かご意見は? – MatthewSpire

+0

'updateTotalLabel()'が実行されている場合、デバッグを試してみます。あなたが 'IBOutlet'を持っているのを見て、正しいものでなければならないので、結果が正しい場合は' print'や 'NSLog'を使うこともできます。 – 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

関連する問題