回答編集履歴

1

ラベルの描画について追記しました。

2024/01/21 01:16

投稿

退会済みユーザー
test CHANGED
@@ -32,3 +32,76 @@
32
32
 
33
33
  *前回の回答で「考え方を変えないといけなそう」と書いたのは、このあたりも踏まえてのことでした。
34
34
 
35
+
36
+ ### 追記です。
37
+
38
+ コメントありがとうございます。
39
+
40
+ > 156行目からのTimerではhundred, ten, oneラベルの値がきちんと変化しておりますが,
41
+ > hundred, ten, oneのラベルの値のみ変化しないのはなぜでしょうか……?
42
+
43
+ これらの記載を見る限りですが、
44
+ 処理の流れをちゃんと追えていないように感じました。
45
+ (タイマーが2つも動いているので、ちょっと追うのが難しいですよね・・)
46
+
47
+ 質問欄の該当のソースコードの書き方もそうですが、
48
+ 何が問題なのか、ご自身で正しく理解するために、
49
+ 単純・シンプルな最小限のソースコードを新しく書いた方が良いと思いました。
50
+ 下に引用するヘルプにある通りですね。
51
+
52
+ > 関連するソースコードを抽出して本文に含めましょう。 多すぎず、少なすぎずという分量の判断は難しいことですが、読むのに苦痛ではないくらいの量に抑える必要があり、でも問題の本質がわかるほどには多くなければいけません。最も良いのは、現象を再現するためのミニマムなプログラムを改めて作ることです。そうすれば、貴方自身が現象と問題をより良く理解することにもつながるからです。
53
+ > [teratail【テラテイル】|ITエンジニア特化型Q&Aサイト](https://teratail.com/help/question-tips#questionTips35)
54
+
55
+ 前回の質問に対する回答も、ただカウントアップするだけのサンプルコードでしたが、
56
+ より単純・シンプル・小さいコードで「考え方」を見てもらいたかったからです。
57
+
58
+ 今回、問題になっている`sleep`の動きを理解するためのコードを書いてみました。
59
+
60
+ ```swift
61
+ class ViewController: UIViewController {
62
+ @IBOutlet weak var hundred: UILabel!
63
+ override func viewDidLoad() {
64
+ super.viewDidLoad()
65
+ // Do any additional setup after loading the view.
66
+ hundred.text = "a"
67
+ }
68
+ @IBAction func startCount(_ sender: UIButton) {
69
+ hundred.text = "b"
70
+ print("b")
71
+ sleep(3)
72
+ }
73
+ }
74
+ ```
75
+
76
+ snowman2さんのご理解だと、
77
+ ボタンをタップして`startCount`メソッドの`sleep`で止まったタイミングでは
78
+ `hundred.text`は"b"になっているはずですね。
79
+
80
+ でもそうはならないですね。
81
+ `startCount`メソッドの処理中(`sleep`している間)は"a"のままです。
82
+
83
+ 「システム側」「アプリ側(開発者側のソースコード)」という言葉は正しくないのかもしれませんが、
84
+ 下の画像のようなイメージです。(イメージなので正しくないと思います・・雰囲気だけ見てください)
85
+
86
+ ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2024-01-21/10ecd857-ba06-43f5-9a01-63fbbf124fa9.png)
87
+
88
+ ポイントは「アプリ側(開発者側のソースコード)」の制御から、
89
+ 「システム側」の制御に戻してあげないといけないというところです。
90
+ (戻すというか、「アプリ側(開発者側のソースコード)」の処理を終了まで動かすというか)
91
+ `startCount`メソッドで`sleep`するということは、
92
+ 制御が「システム側」に戻っていない状況で止まっているということです。
93
+ * `hundred.text = "b"`という命令は「システム側」に画面(ラベル)を変更するように依頼を出すようなイメージですかね。(厳密には違うと思いますが・・)
94
+
95
+
96
+ タイマーに関するところまで書きますと、
97
+ タイマーの場合は`Timer.scheduledTimer`の`{ timer in ... }`(block引数/クロージャ)の中に記述した処理が
98
+ スケジュールごとに「システム側」から呼び出されることになると思います。
99
+ このあたり2つタイマーを使うと理解が難しいと思いますが、
100
+ 一つずつ単純・シンプル・小さなソースコード書きながら理解してみてください。
101
+
102
+
103
+ たくさんある問題をいっぺんに解決しようと思ったら
104
+ 頭の中が整理つかなくて思うように進まないと思います。
105
+ ですので、問題は小さく分割して、一つずつ解決するようにしてみてください。
106
+ 自己解決できることが増えていくと思います。
107
+