Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 基本Xcode-随机数生成器中的引用不工作_Ios_Swift - Fatal编程技术网

Ios 基本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

我正在用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\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
。这避免了将代码硬连接到特定场景。