Arrays 如何只访问数组的每个值一次

Arrays 如何只访问数组的每个值一次,arrays,swift2,Arrays,Swift2,我有一个字符串数组。还有一个变量,它从中随机选择一个字符串。问题是——它可以重复值,我不希望这样。每个值只能显示一次。那我该怎么做呢?我知道在这种情况下,集合比数组更合适,但对我来说更复杂 var questions = ["red", "blue", "green", "square", "tasty"] let randomFact = Int(arc4random_uniform(UInt32(questions.count))) 对于我的应用程序来说,当按下按钮时,它应该显示

我有一个字符串数组。还有一个变量,它从中随机选择一个字符串。问题是——它可以重复值,我不希望这样。每个值只能显示一次。那我该怎么做呢?我知道在这种情况下,集合比数组更合适,但对我来说更复杂

var questions = ["red", "blue", "green", "square", "tasty"]

let randomFact = Int(arc4random_uniform(UInt32(questions.count)))    
对于我的应用程序来说,当按下按钮时,它应该显示新值。我试图从数组中删除值,以避免重复使用

questions.removeAtIndex(Int(questions[randomFact])!)
但它崩溃了


那么,如何随机显示每个值,但仅显示一次

我喜欢您在选择元素后删除该元素的方法。您的代码有一个小问题:

let fact = questions[randomFact]
questions.removeAtIndex(randomFact)

如果在遍历数组长度时执行元素的删除,这可能会导致应用程序崩溃(除非使用删除安全循环)

有关删除安全迭代的更多信息,请参阅

编辑01:循环解决方案

以下代码适用于我,它是否实现了您所追求的目标

var questions = ["red", "blue", "green", "square", "tasty"]

repeat
{
   let randomFact = Int(arc4random_uniform(UInt32(questions.count)))
   print( questions[randomFact] )
   questions.removeAtIndex(randomFact)
}while( questions.count > 0 );
这是输出:

square
tasty
green
red
blue
编辑02:通用解决方案

通常,可以从数组中删除元素,如下所示:

let randomFact = Int(arc4random_uniform(UInt32(questions.count)))
questions.removeAtIndex(randomFact)

但是请记住,如果您在某种程度上依赖于代码中数组的初始大小,这将导致应用程序崩溃。

您能告诉我如何大致做到这一点吗?我试图用上面的代码删除它,结果它崩溃了。你现在的尺寸是什么意思?还剩多少项?@Burundanga在阅读了你的全部问题并看到你已经考虑过这种方法后,我修改了我的答案。你可以在问题中看到OP没有在数组上迭代。他生成一个随机索引,并使用该索引访问/删除元素。问题表明@Burnundanga只想显示数组中随机选取的每个值一次。我认为使用循环是不可避免的,即使代码中没有显示循环本身。他并没有说他使用迭代,只是说每个字符串元素只能显示一次。如果他正在“显示”,那么很可能每个元素都是慢慢选择的,这样就可以看到值。这并不意味着迭代。哦,对于“显示值”,你很高兴
print()
就足够了?那么用户是怎么看的呢?在这个问题中,应用程序的显示部分是离题的(“如何只访问数组的每个值一次”),@Burnundanga询问只访问数组的值一次。我的回答专门针对这一点。这场讨论毫无进展。