基本Xcode - 随机数生成器中的引用不起作用

时间:2015-04-19 18:01:23

标签: ios swift

我正在研究Xcode中一个非常基础的(我认为)程序。我正在尝试为“吸管”编写一个应用程序,其中最后一个被选中的人是失败者。我想做一些事情。首先,请参阅以下代码:

import UIKit

let players = 4

var playerNames: [String] = ["John", "Tyler", "Pete", "Dave"]

var draw = Int(arc4random_uniform(4))

playerNames.removeAtIndex(draw)

print(playerNames)

let round2 = playerNames.count

var draw2 = Int(arc4random_uniform(2))

playerNames.removeAtIndex(draw2)

print(playerNames)

let round3 = playerNames.count

var draw3 = Int(arc4random_uniform(1))

playerNames.removeAtIndex(draw3)

print(playerNames)

首先,我错了是我正在对var draw = Int(arc4random_uniform(4))中绘制的随机整数进行硬编码。当我尝试引用players而不是仅仅输入4时,我收到错误消息。有人可以帮忙解释那里的问题吗?

我现在停在那里,看看能不能解决这个问题,我会等到修好之后再发布一个新问题。谢谢。

2 个答案:

答案 0 :(得分:2)

函数arc4random_uniform()采用UInt32,因此您需要将变量播放器声明为UInt32

let players: UInt32 = 4

var draw = (arc4random_uniform(players))

为了处理圆形变量,您可以将计数转换为UInt32。

let round2 = UInt32(playerNames.count)

您还可以重构代码

let players: UInt32 = 4

var playerNames: [String] = ["John", "Tyler", "Pete", "Dave"]
println(playerNames)

for loop in 1...players {
    RemovePlayer(&playerNames)
    println(playerNames)
}

RemovePlayer函数的代码

func RemovePlayer(inout names: [String]) {
    // get the number of names in the array
    var maxNames = UInt32(names.count)
    var draw = Int((arc4random_uniform(maxNames)))

    names.removeAtIndex(draw)
}

答案 1 :(得分:0)

正如Blackfrog已经说明你的随机化功能需要UInt32

既然你说你刚刚开始编程我想给你一些其他的建议。您的代码可以写成:

var playerNames = ["John", "Tyler", "Pete", "Dave"]

for var index = playerNames.count ; index > 1 ; index -= 1{
    var random:Int = Int(arc4random_uniform(UInt32(index)))
    playerNames.removeAtIndex(random)
}

println(playerNames[0])

这有一些优点。目前,您正在编码加入游戏的玩家数量的值。如果要添加播放器,则需要重新编写不必要的代码。

让我们看看上面的代码是做什么的:

我们首先声明playerNames添加[String]的类型声明是不必要的,swift已经知道它的初始值是这种类型。

for var index = playerNames.count; index > 1 ; index -= 1{

我们创建一个名为index的新变量,它将设置为playerNames数组中的项目数量(本例中为4)
在此之后,只要我们的index大于1,我们就会声明我们需要循环,这将使其运行3次,并确保我们在数组中留下1个项目 每次迭代完成循环后,index -=1将从1中减去index

var random:Int = Int(arc4random_uniform(UInt32(index)))

这里我们声明一个新变量random,它将是Integer类型。让我们从内到外工作。 UIt32(index)会将类型为index的{​​{1}}转换为Int类型,这是必需的,因为我们的随机函数需要UInt32
接下来,我们请求一个随机值,它将位于UInt32index之间(因此在数组的边界之间)。我们想删除属于我们数组中此随机值的播放器。为此,我们需要将随机0转换回Uint32我们可以使用Int执行此操作。

接下来,我们使用

删除Int()处的播放器
index

最后,我们使用

打印数组中剩下的第一个(也是唯一的)项目
playerNames.removeAtIndex(random)