如何在随机选择swift后从数组中删除名称,以便不能再次选择它?

时间:2017-01-27 21:08:32

标签: arrays swift

我正在尝试为我的朋友制作一个应用程序,我随机决定我们的幻想体育草案。现在使用我的应用程序,单击该按钮时,将选择阵列中的随机名称并显示在屏幕上。但是,当显示名称时,我希望将其删除,以便它不会再出现。 函数是我尝试此操作的最新尝试,但它给了我一个错误。有谁知道如何做到这一点?这是我目前使用的代码。

removeName

4 个答案:

答案 0 :(得分:3)

存储两个数组。当从阵列1中随机选择名称时,从阵列1移动到阵列2.当阵列1为空时,交换两个阵列。 (这就是我们游戏行业用来称之为“随机,无重复阵列”的东西。)

func pickName() {
    if names.isEmpty() {
        names = selectedNames
        selectedNames = [:]
    }

    let randomIndex = Int(arc4random_uniform(UInt32(names.count)))        
    let name = names.remove(at: randomIndex)   // remove and return in 1 step!
    selectedNames.append(name)
    return name
}

答案 1 :(得分:0)

根据NRitH的答案尝试这样的事情

var names = [adam, connor, drew, schwenk, langan, tram, trey, joey, nate, goose]
var selectedNames = [String]()

func pickName() -> String? {
    if names.isEmpty {
        names = selectedNames
        selectedNames = []
        return nil
    } else {
        let randomIndex = Int(arc4random_uniform(UInt32(names.count)))
        let randomName = names[randomIndex]
        removeName(randomName)
        return randomName
    }
}

private func removeName(_ name: String) {
    guard let index = names.index(of: name) else { return }
    names.remove(at: index)
    selectedNames.append(name)
}

答案 2 :(得分:0)

方法.remove(at:x)删除特定索引处的项目,也返回该项目。您可以将删除的值存储在名为alreadyDrafted的数组中,而不是使用NRitH建议。

var name        = ["Adam", "Connor", "Drew", ... "Goose"]
var pickedNames = [String]()    


func pickName() -> String {

    let randomIndex = Int(arc4random_uniform(UInt32(names.count - 1))) // you get a Number which you use later as an Index, you don't get the name

    let pickedName = names.remove(at: randomIndex)


    pickedNames.insert(pickedName, at = 0)

    if( names.empty ) {

         names = pickedNames // reset the array

    }

    return pickedName

}

该功能现在删除并返回所选名称。

使用.count()时,请记住它返回数组中的项数。但是数组从0开始,这意味着1(第一)项存储在0

 let firstItem = array[0] 

这些让我们知道最后一项是在.count() - 1.当randomIndex = 10时,你永远不会选择adam并收到错误,因为最后一个值存储在9。

看一下非常有帮助的苹果文档。 Swift Programming Language: Collection Types

答案 3 :(得分:0)

你问的内容略有不同:

func ranomizeElements(elements: [String]) -> [String]
{
    var allElements = elements
    var randomlyOrderedElements: [String] = []
    while allElements.count > 0
    {
        let randomIndex = Int(arc4random_uniform(UInt32(allElements.count)))
        let randomElement = allElements.remove(at: randomIndex)
        randomlyOrderedelEments.append(randomElement)
    }
    return randomlyOrderedElements
}

您可以保留玩家的静态数组并继续调用该功能。只需为每轮草案迭代func的结果。