82460


瞑想アプリを作りたいと思っています。  
それで、ユーザーが選択した時間（息を吐く時間など）、２つの変数があります。一つの変数まで１からカウントアップしたら、今度はもう一つの変数の数字まで１からカウントアップしたいです。

[code]

    // ユーザーが選択した吸う時間と吐く時間
    @AppStorage("exhaleTimer_Value") var exhaleTimerValue = 10
    @AppStorage("inhaleTimer_Value") var inhaleTimerValue = 5
    
    
    // １秒毎にカウントアップ
    timerHandler = Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { _ in
                // タイマー実行時に呼び出される
                // 1秒毎に実行されてカウントダウンする関数を実行
                countdownTimer()
            }
    
    func countdownTimer() {
            // count(経過時間)に+1していく
            count += 1
            
    
[/code]

私としてはこんな風になって欲しいです

[code]

    func breath() {
    // ユーザーが設定した息を吸う時間までカウントアップ
    if count <= inhaleTimerValue {
      // 息を吸う時間までカウントアップ
    } else {
    // countがユーザーが設定した時間を超えたので０に
    　count = 0
    }
    
    // 今度はユーザーが設定した息を吐く時間までカウントアップ
    if count <= exhaleTimerValue {
     //  息を吐く時間までカウントアップ
    } else {
    // countがユーザーが設定した時間を超えたので０に
    　count = 0
    }
    // これを繰り返す
    }
    
[/code]

私がここで一番知りたいことは、息を吸うのカウントアップの後にどうすれば息を吐くのカウントアップができるのか、ということです。  
できればそれを繰り返す処理についても教えていただけたら嬉しいです。

初心者で至らない点も多いと思いますが、回答頂けたら嬉しいです。  
何卒よろしくお願いします。


CC BY-SA 4.0
2021-09-12T09:32:32.777
82440
2021-09-13T08:00:56.413
48051
question
swift xcode
ユーザーが設定した２つの変数があり、一つの変数まで１からカウントアップしたら、今度はもう一つの変数も数字を１からカウントアップしたいです。


解法、アルゴリズムはひとつだけではありません。ここに示すのは、いくつもあるアイデアのうちのひとつだと理解したうえで、お読みください。

二つの変数をカウントアップ、と考えるとむずかしい問題に思えますが、二つの変数を結合してしまって、ひとつの変数に置き換えれば、ごく普通のカウントアップのプログラムとして書くことができます。

[code]

    0: Inhale, 0
    1: Inhale, 1
    2: Inhale, 2
    3: Inhale, 3
    4: Exhale, 0
    5: Exhale, 1
    6: Exhale, 2
    7: Exhale, 3
    ...
    
[/code]

下に示すサンプルコードでは、個々のカウントに新しくインデックスを付加するのに、配列（`Array`）を利用しています。Playgroundで実行できるように書いてありますので、そのままコピー＆ペーストで実行してみてください。

[code]

    import PlaygroundSupport
    import UIKit
    
    class ViewController: UIViewController {
        
        override func viewDidLoad() {
            super.viewDidLoad()
            
            // 吸気4回、呼気4回、全体の繰り返し2回を指定してメソッド実行。
            startCounter(inhale: 4, exhale: 4, repeatCount: 2)
        }
        
        func startCounter(inhale: Int, exhale: Int, repeatCount: Int) {
            // 引数が負数でないか確認。
            if inhale < 0 || exhale < 0 || repeatCount < 0 { return }
            // 吸気の配列を作成。
            let inhaleArray = [Int](0..<inhale).map { item in
                ("Inhale", item)
            }
            // 呼気の配列を作成。
            let exhaleArray = [Int](0..<exhale).map { item in
                ("Exhale", item)
            }
            // 二つの配列を結合。
            let counterArray = inhaleArray + exhaleArray
            // 総カウント回数を計算して保存。
            let maxCounter = (inhale + exhale) * repeatCount
            // カウンタ変数の宣言と初期化。
            var count = 0
            //　タイマーの生成と開始。
            Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { timer in
                // 剰余でインデックスを得る。
                let number = count % counterArray.count
                // インデックス指定して、出力
                print("\(counterArray[number].0), \(counterArray[number].1)")
                // カウンターをインクリメント。
                count += 1
                // 総カウント数を、カウンタが超えたら、タイマー終了。
                if count >= maxCounter {
                    timer.invalidate()
                }
            }
        }
    }
    
    PlaygroundPage.current.liveView = ViewController()
    
[/code]

メモ：

`[0, 1, 2, 3, 4, 5]`のような配列を簡単に作る方法があります。

[code]

    let numbers = [Int](0..<6)
    
[/code]

使う頻度の高そうな方法なので、覚えておくといいでしょう。  
他に、`map`メソッドや、タプル（Tuple）も使用しています。個々に勉強してください。


CC BY-SA 4.0
2021-09-13T08:00:56.413
82460
2021-09-13T08:00:56.413
18540
82440
answer