

ストーリーボードでラベルとボタンを一つずつ用意し、下記のコードを実行させると、ボタンを押したらラベルに「あ」と表示されるようになりました。  
これを、2回目タップで「い」 ３回目タップで「う」．．．というように、タップ回数に応じて表示される文字を変えるには、どうすれば良いのでしょうか？

[code]

    import UIKit
    
    class ViewController: UIViewController {
    
        @IBOutlet weak var Label: UILabel!
    
        @IBAction func Button(_ sender: UIButton) {
            Label.text= "あ"
        }
    
    }
    
[/code]


CC BY-SA 3.0
2016-11-08T13:27:05.557
30218
2017-04-12T13:45:24.500
2016-11-09T11:26:33.933
5519
19490
question
swift
ボタンタップでラベルの文字を変更


タップした回数によって処理を変えるので、まずタップした回数を変数に保存しておく必要があります。  
そしてその変数を使ってタップした回数によってラベルに代入する値を変更します。

[code]

    class ViewController: UIViewController {
    
        @IBOutlet weak var Label: UILabel!
    
        var tapCount = 0
    
        @IBAction func Button(_ sender: UIButton) {
            tapCount += 1
            if tapCount == 1 {
                Label.text = "あ"
            } else if tapCount == 2 {
                Label.text = "い"
            } else if tapCount == 3 {
                Label.text = "う"
            }
            ...
        }
    
    }
    
[/code]


CC BY-SA 3.0
2016-11-09T11:31:42.867
30268
2016-11-11T08:26:03.157
2016-11-11T08:26:03.157
5519
5519
30218
answer


先の回答では

  * tapCount += 1を先に実行しているので、tapCount == 0には絶対ならない 
  * tapCount == 2をtapCount == 3にTypoしている

のミスが見られます。こういう間違いを少なくするために、直値でコーディングするのを避けた例が以下になります。

[code]

    class ViewController: UIViewController {
    
        @IBOutlet weak var Label: UILabel!
    
        let labels = ["あ", "い", "う", "え", "お", "か", "き", "く", "け", "こ"]
        var tapCount = 0
    
        @IBAction func Button(_ sender: UIButton) {
            Label.text= labels[tapCount % labels.count]
            tapCount += 1
        }// end func Button
    }// end class ViewController
    
[/code]

この様にラベル文字列を配列に入れ、配列の中のどの文字（列）を使うかのインデックスをカウンターと配列の個数の商余から求めることで、配列の長さを変えてもタップ数が配列を行き過ぎたら最初から拾い直しになるので範囲オーバーが起きることも防げます  
また、ラベルに表示させる文字列が一箇所にまとまるので、見やすく、改造しやすいというメリットもあります。


CC BY-SA 3.0
2016-11-10T02:55:16.697
30293
2016-11-10T02:55:16.697
14745
30218
answer