無視される、というのは言い方が違うかもしれませんが、この表現が一番しっくりくるのでご容赦ください。
while文を使っていて気になったことがありましたので質問させていただきます。
理想的なwhile文
Swift
1var countA = 0 2while countA < 3 { 3 print("countA: (countA)") 4 countA += 1 5}
以下がプリントされます。
countA: 0 countA: 1 countA: 2
わからないこと・困ったこと
複雑な処理をwhile文で行いたいため、これを擬似的に表現するため時間に揺らぎを与えて実行すると、条件を無視して無限に処理が続いてしまいます。
Swift
1import Foundation 2 3let dispatchQueue = DispatchQueue(label: "queue") 4 5var countB = 0 6while countB < 3 { 7 // 時間遅れに揺らぎ(0.5秒から1.0秒の間)を与える 8 let delay = Double.random(in: 0.5...1.0) 9 dispatchQueue.asyncAfter(deadline: .now() + delay) { 10 print("countB: (countB)") 11 countB += 1 12 } 13}
以下がプリントされます。
countB: 0 countB: 1 countB: 2 countB: 3 // (省略) countB: 3243 countB: 3244 countB: 3245 countB: 3246 // (止めない限り無限に続く)
順番通りに処理されるので揺らぎが効いているのか?という疑問もありますが。
また、変数checkCountB
で0番目が終わったら1番目へ……と行わせるようにすると、上と同じように条件は無視されますが4回目が終わったところで止まります。
Swift
1import Foundation 2 3let dispatchQueue = DispatchQueue(label: "queue") 4 5var countB = 0 6var checkCountB = 0 7while countB < 3 { 8 if countB == checkCountB { 9 checkCountB += 1 10 // 時間遅れに揺らぎ(0.5秒から1.0秒の間)を与える 11 let delay = Double.random(in: 0.5...1.0) 12 dispatchQueue.asyncAfter(deadline: .now() + delay) { 13 print("countB: (countB)") 14 countB += 1 15 } 16 } 17}
以下がプリントされます。
countB: 0 countB: 1 countB: 2 countB: 3
このように、条件が無視されて処理が続くのはどのようなときなのか、
その対処法などありましたら教えていただきたく思います。
具体的なこと
質問内容は上記で以上なのですが、念のため実際に使っている部分も掲載します。
(ややこしいので読み飛ばしていただいても大丈夫だと思います)
データベースにIDを保存する処理(前回の質問)を、
1人目、1人目が終わったら2人目……と順番にやりたかったので、以下のように書いています。
Swift
1var planIDsOnDatabase = [String]() // メンバ変数で定義しています 2 3// ---------- ↓実際の処理 ---------- 4 5var everyone = ["sample01", "sample02", "sample03"] 6print("everyoneの要素数: (everyone.count)") // 3 7 8var count = 0 9var checkCount = 0 10 11while count < everyone.count { 12 13 if count == checkCount { 14 checkCount += 1 15 planIDsOnDatabase.removeAll() 16 17 print("count: (count)") 18 fetchPlanIDs(accountID: everyone[count], completion: { 19 // データベースの予定ID取得後に新たなIDを追加 20 self.planIDsOnDatabase.append(planID) 21 22 // 次の処理(データベースに保存) 23 self.addPlanIDToDatabase(accountID: everyone[count], newPlanID: planID, completion: { 24 // データベースに予定ID保存後、次の人へ 25 count += 1 26 }) 27 }) 28 } 29}
条件式while count < everyone.count
から、0〜2までの3回実行させたいのですが、意図せず4回目が実行されてしまいエラーになります。
以下のようにプリントされます。
everyoneの要素数: 3 count: 0 count: 1 count: 2 count: 3 Fatal error: Index out of range: file Swift/ContiguousArrayBuffer.swift, line 444 2020-10-12 08:25:30.191834+0900 varmeets[1929:70602] Fatal error: Index out of range: file Swift/ContiguousArrayBuffer.swift, line 444 Message from debugger: The LLDB RPC server has exited unexpectedly. Please file a bug if you have reproducible steps.
補足情報(FW/ツールのバージョンなど)
Xcode 11.6
Swift 5
ここまで読んでくださり、ありがとうございます。
質問に至らぬ点があるかもしれませんが、どうぞよろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/10/13 00:30
2020/10/13 05:06
2020/10/13 05:09
2020/10/13 07:40
2020/10/13 21:52