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

Arrays 如何更好地使用repeat while循环进行索引和数组,arrays,swift,loops,while-loop,iteration,Arrays,Swift,Loops,While Loop,Iteration,我想从给定数组中随机选取一个汉字结构项,将属性“kanji”添加到另一个临时数组中,并执行检查,如果随机选取的struct.kanji出现在yetShowedArray中,则重复随机选取,直到找到yetShowedArray中不存在汉字的结构才能使用它 实际的重复/while流不能保证它发生 //test for the not repeating run **********************************************************************

我想从给定数组中随机选取一个汉字结构项,将属性“kanji”添加到另一个临时数组中,并执行检查,如果随机选取的struct.kanji出现在
yetShowedArray
中,则重复随机选取,直到找到
yetShowedArray
中不存在汉字的结构才能使用它

实际的重复/while流不能保证它发生

//test for the not repeating run *************************************************************************************

        //check if the two array have the same number of items
        guard arrayToUse.count !=  yetShowedArray.count else {
            print("finished all the kanji")
            var matching = 0
            for element in arrayToUse {
                if yetShowedArray.contains(element.kanji!){
                    matching += 1
                }
            }
            print("matching kanji are : \(matching)")
            return
        }

        var random = Int(arc4random_uniform(UInt32(arrayToUse.count)))

        //Instance
        kanjiToShow = arrayToUse[random]
        guard let kanjiToTrack = kanjiToShow.kanji else {
            print("kanjiToTrack is nil!!!")
            return
        }


        if yetShowedArray.contains(kanjiToTrack){
            print("contained")

            repeat {
                random = Int(arc4random_uniform(UInt32(arrayToUse.count)))
                kanjiToShow = arrayToUse[random]

            } while yetShowedArray.contains(kanjiToTrack)
            print("refreshed random")

        }
        else {
            print("never used before")
        }

        yetShowedArray.append(kanjiToTrack)
        print(yetShowedArray)

        print("arrayToUse: \(arrayToUse.count) yetShowedArray: \(yetShowedArray.count)")

        //test for the not repeating run *************************************************************************************
解决方案

在Anton Novoselov的回答后发现

我将let
kanjiToTrack
更改为var,然后在repeat循环中刷新它

//Instance
        kanjiToShow = arrayToUse[random]
        guard var kanjiToTrack = kanjiToShow.kanji else {
            print("kanjiToTrack is nil!!!")
            return
        }


        if yetShowedArray.contains(kanjiToTrack){
            print("contained")

            repeat {
                random = Int(arc4random_uniform(UInt32(arrayToUse.count)))
                kanjiToShow = arrayToUse[random]
                kanjiToTrack = kanjiToShow.kanji!


            } while yetShowedArray.contains(kanjiToTrack)

            print("refreshed random")

        }
        else {
            print("never used before")
        }
第二种解决方案

let random = Int(arc4random_uniform(UInt32(arrayToUse.count)))

    //Instance
    kanjiToShow = arrayToUse[random]
    guard kanjiToShow.kanji != nil else {
        print("kanjiToTrack is nil!!!")
        return
    }

    arrayToUse.remove(at: random)

尝试在重复循环内再次刷新kanjiToTrack。正如您所说的,它是struct-value类型,所以您似乎在while子句中检查了相同的kanjiToTrack。试试这个:

       repeat {
            random = Int(arc4random_uniform(UInt32(arrayToUse.count)))
            kanjiToShow = arrayToUse[random]
            guard let kanjiToTrack = kanjiToShow.kanji else {return}


        } while yetShowedArray.contains(kanjiToTrack)

thanx为了寻求帮助,我不得不稍微修改一下您的解决方案,但您给出了正确的提示!,你觉得我的版本怎么样?这个逻辑对你合适吗?对我来说,没关系。但也许,从arrayToUse中取出汉字卡更好?将卡放入yetShowedArray并从arrayToUse中移除。在这种情况下,你不需要这个循环,当几乎所有的卡都在yetShowedArrayYes内时,它可能需要很多循环,看起来不错。在这种情况下,你不需要循环。只需添加和删除..嗨,安东,你能帮我理解这里的解决方案吗?