我在Swift 3(Xcode)中有一个String
的数组,我想从中读出5个随机的独特元素。我正在尝试这样的事情:
class ViewController: UIViewController {
@IBOutlet var Nr1: UILabel!
@IBOutlet var Nr2: UILabel!
@IBOutlet var Nr3: UILabel!
@IBOutlet var Nr4: UILabel!
@IBOutlet var Nr5: UILabel!
myArray = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"]
func foo() {
for index in 0..<6 {
let randomNr = Int(arc4random_uniform(UInt32(myArray.count)))
Nr+(index).text = String (randomNr)
}
}
}
但我不能将迭代索引作为占位符来获取Nr1.text
,Nr2.text
,Nr3.text
等。
接下来的问题是:我如何比较随机项目以使它们是唯一的?
有人可以帮我解决这个问题吗?
答案 0 :(得分:0)
我这样做的方法是将它们插入到一个arraylist中,并产生一个介于0和列表大小之间的数字。使用此数字从列表中获取和删除该项,然后重复此过程。每次尺寸变小时都不可能得到一个非独特的项目,因为你正在取出它们。
答案 1 :(得分:0)
您可以尝试以下内容。
首先,添加Fisher-Yates shuffle的这个实现(来自here),以便随机化数组中的元素。
extension MutableCollection {
/// Shuffles the contents of this collection.
mutating func shuffle() {
let c = count
guard c > 1 else { return }
for (firstUnshuffled, unshuffledCount) in zip(indices, stride(from: c, to: 1, by: -1)) {
let d: IndexDistance = numericCast(arc4random_uniform(numericCast(unshuffledCount)))
let i = index(firstUnshuffled, offsetBy: d)
swapAt(firstUnshuffled, i)
}
}
}
extension Sequence {
/// Returns an array with the contents of this sequence, shuffled.
func shuffled() -> [Element] {
var result = Array(self)
result.shuffle()
return result
}
}
然后使用shuffled()
方法随机化数组中的元素,获取前五个元素,并将它们放入标签中。
class ViewController: UIViewController {
// ...
let myArray = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"]
func foo() {
// Take the array and shuffle it.
let shuffled = self.myArray.shuffled()
// Slice the first five elements.
let randomElements = shuffled[0..<5]
// Build an array that contains all the labels in order.
let outlets = [self.nr1, self.nr2, self.nr3, self.nr4, self.nr5]
// Loop through the randomly chosen elements, together with their indices.
for (i, randomElement) in randomElements.enumerated() {
// Put the random element at index `i` into the label at index `i`.
outlets[i]?.text = randomElement
}
}
// ...
}
在您的问题中尝试按顺序访问每个IBOutlet
的内容将无效,因为您无法从变量内的值形成标识符。但是,您可以循环浏览IBOutlet
s,如上所示。
附加说明:我已将UILabel
变量的名称从Nr1
,Nr2
等更改为nr1
,nr2
等。这是因为在Swift中,UpperCamelCase
只应用于类型名称,而变量等应使用lowerCamelCase
命名。