swift 如何更好地使用repeat while循环进行索引和数组

m0rkklqb  于 2024-01-05  发布在  Swift
关注(0)|答案(1)|浏览(146)

我想从一个给定的数组中随机选择一个KanjiCard结构项,将属性“kanji”添加到另一个临时数组并执行检查,如果随机选择的结构。kanji存在于yetShowedArray中,重复随机选择,直到找到一个结构,其中kanji不存在于yetShowedArray中,以便使用它
实际的重复/while流并不确保其发生。

  1. //test for the not repeating run *************************************************************************************
  2. //check if the two array have the same number of items
  3. guard arrayToUse.count != yetShowedArray.count else {
  4. print("finished all the kanji")
  5. var matching = 0
  6. for element in arrayToUse {
  7. if yetShowedArray.contains(element.kanji!){
  8. matching += 1
  9. }
  10. }
  11. print("matching kanji are : \(matching)")
  12. return
  13. }
  14. var random = Int(arc4random_uniform(UInt32(arrayToUse.count)))
  15. //Instance
  16. kanjiToShow = arrayToUse[random]
  17. guard let kanjiToTrack = kanjiToShow.kanji else {
  18. print("kanjiToTrack is nil!!!")
  19. return
  20. }
  21. if yetShowedArray.contains(kanjiToTrack){
  22. print("contained")
  23. repeat {
  24. random = Int(arc4random_uniform(UInt32(arrayToUse.count)))
  25. kanjiToShow = arrayToUse[random]
  26. } while yetShowedArray.contains(kanjiToTrack)
  27. print("refreshed random")
  28. }
  29. else {
  30. print("never used before")
  31. }
  32. yetShowedArray.append(kanjiToTrack)
  33. print(yetShowedArray)
  34. print("arrayToUse: \(arrayToUse.count) yetShowedArray: \(yetShowedArray.count)")
  35. //test for the not repeating run *************************************************************************************

字符串
溶液
在安东·诺沃肖洛夫回答
我将let kanjiToTrack更改为var,然后在repeat循环中刷新它

  1. //Instance
  2. kanjiToShow = arrayToUse[random]
  3. guard var kanjiToTrack = kanjiToShow.kanji else {
  4. print("kanjiToTrack is nil!!!")
  5. return
  6. }
  7. if yetShowedArray.contains(kanjiToTrack){
  8. print("contained")
  9. repeat {
  10. random = Int(arc4random_uniform(UInt32(arrayToUse.count)))
  11. kanjiToShow = arrayToUse[random]
  12. kanjiToTrack = kanjiToShow.kanji!
  13. } while yetShowedArray.contains(kanjiToTrack)
  14. print("refreshed random")
  15. }
  16. else {
  17. print("never used before")
  18. }


第二溶液

  1. let random = Int(arc4random_uniform(UInt32(arrayToUse.count)))
  2. //Instance
  3. kanjiToShow = arrayToUse[random]
  4. guard kanjiToShow.kanji != nil else {
  5. print("kanjiToTrack is nil!!!")
  6. return
  7. }
  8. arrayToUse.remove(at: random)

drnojrws

drnojrws1#

尝试在repeat循环中再次刷新kanjiToTrack。正如你所说的,它是struct - value类型,所以看起来你在while子句中检查了相同的kanjiToTrack。试试这个:

  1. repeat {
  2. random = Int(arc4random_uniform(UInt32(arrayToUse.count)))
  3. kanjiToShow = arrayToUse[random]
  4. guard let kanjiToTrack = kanjiToShow.kanji else {return}
  5. } while yetShowedArray.contains(kanjiToTrack)

字符串

相关问题