如何在 Swift 中从数组中提取随机项?

Posted

技术标签:

【中文标题】如何在 Swift 中从数组中提取随机项?【英文标题】:How to pull random item out of an array in Swift? 【发布时间】:2014-06-06 19:50:31 【问题描述】:

我正在尝试从数组中拉出一个随机项。当我跑步时,它在拉一个随机项目和给我这个错误“EXC_BAD_INSTRUCTION”之间工作大约 50/50。知道发生了什么吗?

现在我的代码如下所示:BEFORE Solution

   func randomCard() -> Card 
    let randomIndex = Int(arc4random()) % cardArray.count
    let randomCard = cardArray[randomIndex]

    cardArray.removeAtIndex(randomIndex)

    return randomCard

之后

   func randomCard() -> Card 

    let randomIndex = arc4random_uniform(UInt32(cardArray.count))
    let randomCard = cardArray[randomIndex.hashValue]

    cardArray.removeAtIndex(randomIndex.hashValue)

    return randomCard

这是我现在正在使用的,似乎正在工作。感谢大家的帮助。

【问题讨论】:

您能否确定randomIndex 的哪些值有效,哪些返回EXC_BAD_INSTRUCTION 似乎是随机的。它有时有效,有时无效。 哪一行导致了错误?记录随机索引。 顺便说一句,arc4random_uniform(cardArray.count); 更好(没有偏见)和更容易使用; 这听起来像the same bug someone experienced a couple of days ago。你没有做错任何事——这是 Swift 中的一个错误,毕竟它仍处于测试阶段。 【参考方案1】:

arc4random 可以返回负数,这会给您带来麻烦,因为negative % positive = negative 更好的方法是使用arc4random_uniform

let randomIndex = arc4random_uniform(UInt32(cardArray.count))

EXC_BAD_INSTRUCTION 似乎是抛出边界错误的糟糕异常,但这似乎是你得到的。

【讨论】:

当我尝试使用 arc4random_uniform(cardArray.count) 时,我收到一条错误消息,提示无法将 NSNumber 发送到 UInt32。

以上是关于如何在 Swift 中从数组中提取随机项?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中从 alamofire 中提取数据? [复制]

如何在 Swift 3 中从数据中提取 Int16

在swift中从数组中提取值

如何在 Swift 中从数组中删除一个元素

如何在 Swift 5 中从数组中获取值

如何在 Swift 中从 Firebase 接收数组