Ios 基本Xcode-随机数生成器中的引用不工作
我正在用Xcode编写一个非常基本(我认为)的程序。我正在尝试编写一个“抽吸管”应用程序,其中最后一个被选中的人是失败者。有几件事我想做。首先,请参见下面的代码:Ios 基本Xcode-随机数生成器中的引用不工作,ios,swift,Ios,Swift,我正在用Xcode编写一个非常基本(我认为)的程序。我正在尝试编写一个“抽吸管”应用程序,其中最后一个被选中的人是失败者。有几件事我想做。首先,请参见下面的代码: import UIKit let players = 4 var playerNames: [String] = ["John", "Tyler", "Pete", "Dave"] var draw = Int(arc4random_uniform(4)) playerNames.removeAtIndex(draw) pr
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\u uniform(4))
中绘制的随机整数。当我尝试引用玩家
而不是仅仅键入4
时,我会得到一个错误。有人能帮我解释一下那里的问题吗
我现在就到此为止,看看是否可以解决这个问题,我会等到问题解决后再发布新问题。多谢各位 该函数采用UInt32,因此需要将变量player声明为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)
}
正如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个)在此之后,我们将声明只要
索引大于1
就需要循环,这将使循环运行3次,并确保数组中只剩下1项
循环每次迭代后,索引-=1
将从索引中减去1
var random:Int = Int(arc4random_uniform(UInt32(index)))
这里我们声明了一个新变量random
,它将是Integer类型。让我们从内到外工作UIt32(索引)
将把类型为Int
的索引
转换为类型为UInt32
,这是必需的,因为我们的随机函数需要一个UInt32
接下来,我们请求一个随机值,它将位于索引
和0
之间(因此位于数组的边界之间)。我们想移除数组中属于此随机值的玩家。为此,我们需要将随机的Uint32
转换回Int
,我们可以通过使用Int()
来实现
接下来,我们使用
playerNames.removeAtIndex(random)
最后,我们使用
println(playerNames[0])
显示实际导致错误的代码以及不导致错误的代码…你是说下面的var draw=Int(arc4random_uniform(player))代码>导致错误?如果是这样的话,那是什么错误呢?谢谢你,这很好用。跟进(如果这更合适的话,我可以把这个问题放在一个新的问题中),当我进一步向下移动以进行额外的抽签(如draw2
)时,情况会如何?因为现在我从playernames
中提取count
,但是playernames
是一个字符串,而不是UInt32。有没有办法调和这一点?谢谢。你不需要声明你的玩家变量UInt32,你只需要将你的随机方法改为var draw=Int(arc4random\u uniform(UInt32(player)))var draw=Int(arc4random\u uniform(UInt32(playerNames.count)),我建议完全放弃玩家
,只需使用playerNames.count
。这避免了将代码硬连接到特定场景。