我试图在这样的字符串中获取2个不同的随机值
var players = ["Jack, John, Michael, Peter"]
var playersArray = ["\(players.randomElement) and \(players.randomElement) has to battle")
我该怎么做,因此它具有2个不同的值?
答案 0 :(得分:0)
前一段时间,我创建了一个类RandomObjects
,该类维护一个对象数组,可用于一次从该数组中提供随机的,非重复的对象。它的工作方式是维护一个索引数组,并从索引数组中删除一个索引,直到耗尽为止。
甚至提供了在返回所有值之后“重新填充”索引的规定,以及避免在重新填充索引数组之后返回相同值的逻辑。
它是用Swift 2编写的,但我刚刚将其更新为Swift 4并将其发布到了GitHub:
https://github.com/DuncanMC/RandomObjects.git
该类的定义如下:
class RandomObjects<T> {
var objectsArray: [T]
var indexes: [Int]!
var oldIndex: Int?
该类代码的关键是这个功能:
public func randomObject(refillWhenEmpty: Bool = true) -> T? {
var randomIndex: Int
var objectIndex: Int
if refillWhenEmpty {
fillIndexesArray()
} else if indexes.isEmpty {
return nil
}
repeat {
randomIndex = Int(arc4random_uniform(UInt32(indexes.count)))
objectIndex = indexes[randomIndex]
} while objectIndex == oldIndex
indexes.remove(at: randomIndex)
oldIndex = objectIndex
return objectsArray[objectIndex];
}
仅当您遍历数组中的每个对象并重新填充了索引数组时,才需要对objectIndex == oldIndex
进行检查。这样可以确保您不会重复上一个条目。