質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.22%

pickerViewの外に値を移す

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 808

midori0822

score 59

タイトルの通りの質問です。
下記のコードで数値2つを入力、それを演算子1つ選んで計算するツールを作っています。

import UIKit

class ViewController: UIViewController, UIPickerViewDelegate,UIPickerViewDataSource,UITextFieldDelegate {

  override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    let suuzi1 = UITextField()
    let suuzi2 = UITextField()




    suuzi1.delegate = self
    suuzi2.delegate = self

    suuzi1.placeholder = "数字を入力"
    suuzi2.placeholder = "数字を入力"

    suuzi1.leftViewMode = .always
    suuzi1.leftView = UIView(frame: CGRect(x:0,y:0,width:10,height:10))
    suuzi2.leftViewMode = .always
    suuzi2.leftView = UIView(frame: CGRect(x:0,y:0,width:10,height:10))

    suuzi1.clearButtonMode = .always
    suuzi2.clearButtonMode = .always

    suuzi1.returnKeyType = .done
    suuzi2.returnKeyType = .done


    self.suuzi1.keyboardType = .numberPad
    self.suuzi2.keyboardType = .numberPad
  }

  func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    suuzi1.resignFirstResponder()
    suuzi2.resignFirstResponder()
    return true
  }

  func textFieldShouldClear(_ textField: UITextField) -> Bool {
    print("clear")
    return true
  }
  func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
    print("start")
    return true
  }

  func textFieldShouldEndEditing(_ textField: UITextField) -> Bool {
    print("end")
    return true
  }
  let enzansiX = ["+","-","×","÷"]

  @IBOutlet weak var suuzi1: UITextField!
  @IBOutlet weak var suuzi2: UITextField!
  @IBOutlet weak var enzansi: UILabel!
  @IBOutlet weak var result: UILabel!



  func numberOfComponents(in pickerView: UIPickerView) -> Int {
    return 1
  }

  func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
    return enzansiX.count

  }
  func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
    return enzansiX[row]
  }
  func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
    let enzansiY:String = enzansiX[row]

    enzansi.text = "enzansiX[row]"

    switch enzansiY {
    case "+": var resultX = Double(suuzi1.text!)! + Double(suuzi2.text!)!
    case "-": var resultX = Double(suuzi1.text!)! - Double(suuzi2.text!)!
    case "×": var resultX = Double(suuzi1.text!)! * Double(suuzi2.text!)!
    case "÷": var resultX = Double(suuzi1.text!)! / Double(suuzi2.text!)!
     default : break

    }

  }
  @IBAction func calc(_ sender: Any) {

    result.text = Double(suuzi1.text!)! + enzansiX[row] + Double(suuzi2.text!)! + "の答えは\(resultX)です"

  }

最後のcalcボタンを押したときに結果を表示したいのですが、

 result.text = Double(suuzi1.text!)! + enzansiX[row] + Double(suuzi2.text!)! + "の答えは\(resultX)です"


このenzansiX[row],resultXの変数にそれぞれUse of unresolved identifier''の警告が出ます。
上記のpickerViewメソッド内で行われた代入値などはそのメソッド外では使えないのですか?
持ち出せるのであればその方法を教えてください。
suuzi1,suuzi2に警告が出てこないということはDelegateが関与しているのでしょうか。返信お待ちしております。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

スコープの問題

  @IBAction func calc(_ sender: Any) {

    result.text = Double(suuzi1.text!)! + enzansiX[row] + Double(suuzi2.text!)! + "の答えは\(resultX)です"

  }


このcalc関数内のresultXですがどこで宣言が行われているかと言うと

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        let enzansiY:String = enzansiX[row]

        enzansi.text = enzansiX[row]

        switch enzansiY {
            case "+": var resultX = Double(suuzi1.text!)! + Double(suuzi2.text!)!
            case "-": var resultX = Double(suuzi1.text!)! - Double(suuzi2.text!)!
            case "×": var resultX = Double(suuzi1.text!)! * Double(suuzi2.text!)!    
            case "÷": var resultX = Double(suuzi1.text!)! / Double(suuzi2.text!)!
            default : break
        }
}


このswitch文の中です。これではcalc関数内からは見えません。なのでresultXをどこかcalc関数から見えるところに(例えばクラスの名前の1行下とか)に置いて、switch文のvarを全部取ってあげるとcalc関数はresultXが見えるようになります。またこの関数外にdidSelectedRow等の変数を用意しておき、この関数内で

didSelectedRow = row


としてあげればrowが外部でも使えるのであとは配列と組み合わせて使えばいいかと。
ですがこの辺りのやり方、ピッカーの操作が早すぎる場合にはきっちりついて来てくれない場合があるので注意です。

型の問題

同一の型同士であれば+演算子が使えます。StringとString、IntとIntみたいな型同士ですね。ですがDoubleとStringのように型が違うと+演算子が使えません。また色んな値をまとめてStringにしようとするときは

result.text = "\(Double(suuzi1.text!)!) \(enzansiX[row]) \(Double(suuzi2.text!)!) の答えは\(resultX)です"


と最初から最後まで""で囲って上げるのが定石です(ダブルクォートといいます)。
また逆に

enzansi.text = "enzansiX[row]"


はダブルクォートを取ってあげないと+とかーではなくenzansiX[row]と言う文字列として扱われてしまいます。

サンプル

import UIKit
class ViewController: UIViewController, UIPickerViewDelegate,UIPickerViewDataSource,UITextFieldDelegate {

    var resultX = Double(0)
    let enzansiX = ["+","-","×","÷"]

    var selectedRow = 0

    @IBOutlet weak var suuzi1: UITextField!
    @IBOutlet weak var suuzi2: UITextField!
    @IBOutlet weak var enzansi: UILabel!
    @IBOutlet weak var result: UILabel!

    @IBAction func tap(_ sender: Any) {
        result.text = "\(Double(suuzi1.text!)!) \(enzansiX[selectedRow]) \(Double(suuzi2.text!)!) の答えは\(resultX)です"
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        let suuzi1 = UITextField()
        let suuzi2 = UITextField()

        suuzi1.delegate = self
        suuzi2.delegate = self

        suuzi1.placeholder = "数字を入力"
        suuzi2.placeholder = "数字を入力"

        suuzi1.leftViewMode = .always
        suuzi1.leftView = UIView(frame: CGRect(x:0,y:0,width:10,height:10))
        suuzi2.leftViewMode = .always
        suuzi2.leftView = UIView(frame: CGRect(x:0,y:0,width:10,height:10))

        suuzi1.clearButtonMode = .always
        suuzi2.clearButtonMode = .always

        suuzi1.returnKeyType = .done
        suuzi2.returnKeyType = .done

        self.suuzi1.keyboardType = .numberPad
        self.suuzi2.keyboardType = .numberPad
    }

    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        suuzi1.resignFirstResponder()
        suuzi2.resignFirstResponder()
        return true
    }

    func textFieldShouldClear(_ textField: UITextField) -> Bool {
        print("clear")
        return true
    }
    func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
        print("start")
        return true
    }

    func textFieldShouldEndEditing(_ textField: UITextField) -> Bool {
        print("end")
        return true
    }

    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1
    }

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return enzansiX.count

    }
    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        return enzansiX[row]
    }
    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        let enzansiY:String = enzansiX[row]

        enzansi.text = enzansiX[row]

        switch enzansiY {
            case "+": resultX = Double(suuzi1.text!)! + Double(suuzi2.text!)!
            case "-": resultX = Double(suuzi1.text!)! - Double(suuzi2.text!)!
            case "×": resultX = Double(suuzi1.text!)! * Double(suuzi2.text!)!
            case "÷": resultX = Double(suuzi1.text!)! / Double(suuzi2.text!)!
            default : break
        }
        selectedRow = row

    }

}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.22%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる