jeudi 14 mars 2019

Returning a random element from an array with no repeated numbers (Swift 4.2)

I'm trying to return random elements from an array with no repeated results, I haven't been able to find a solution for Swift 4.2 that uses the new RandomKit.

The current setup I have will return random titles for the "VowelFaceXX" IBOutlets, but will often repeat results. I want each IBOutlet to have a unique result.

I would also ideally like to be able to have more than 5 elements in the array at a later date, but staying with the 5 IBOutlets.

I have posted the code below:

import UIKit
import AVFoundation

class VowelsVC: UIViewController {


var audioPlayer : AVAudioPlayer?
var selectedSoundFileName : String = ""
var randomVowelIndex : Int = 0
var vowelArray = ["A", "E", "I", "O", "U"]


@IBOutlet weak var vowelFace01: UIButton!
@IBOutlet weak var vowelFace02: UIButton!
@IBOutlet weak var vowelFace03: UIButton!
@IBOutlet weak var vowelFace04: UIButton!
@IBOutlet weak var vowelFace05: UIButton!


func randomVowel() {
    randomVowelIndex = Int.random(in: 0 ... 4)
}


func playAudio() {
    let path = Bundle.main.path(forResource: selectedSoundFileName, ofType:nil)!
    let url = URL(fileURLWithPath: path)

    do {
        audioPlayer = try AVAudioPlayer(contentsOf: url)
        audioPlayer?.play()
    } catch {
        print("Couldn't load audio") }
}


@IBAction func dismissVowelVC(_ sender: Any) {
    self.dismiss(animated: true, completion: nil)
}


override func viewDidLoad() {
    super.viewDidLoad()

    randomVowel()
    selectedSoundFileName = "WhichOneIs.mp3"

    playAudio()

    let when = DispatchTime.now() + 1.7
    DispatchQueue.main.asyncAfter(deadline: when) {
        self.selectedSoundFileName = self.vowelArray[self.randomVowelIndex]+".mp3"
        self.playAudio()

    }

    randomVowel()
    vowelFace01.setTitle("\(vowelArray[randomVowelIndex])", for: .normal)
    randomVowel()
    vowelFace02.setTitle("\(vowelArray[randomVowelIndex])", for: .normal)
    randomVowel()
    vowelFace03.setTitle("\(vowelArray[randomVowelIndex])", for: .normal)
    randomVowel()
    vowelFace04.setTitle("\(vowelArray[randomVowelIndex])", for: .normal)
    randomVowel()
    vowelFace05.setTitle("\(vowelArray[randomVowelIndex])", for: .normal)
}


}




Aucun commentaire:

Enregistrer un commentaire