从Swift 3中的String Array中读出随机项

时间:2018-02-12 16:09:38

标签: arrays swift loops iteration

我在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.textNr2.textNr3.text等。

接下来的问题是:我如何比较随机项目以使它们是唯一的?

有人可以帮我解决这个问题吗?

2 个答案:

答案 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变量的名称从Nr1Nr2等更改为nr1nr2等。这是因为在Swift中,UpperCamelCase只应用于类型名称,而变量等应使用lowerCamelCase命名。