我试图从数组中返回没有重复结果的随机元素,我无法找到使用新RandomKit的Swift 4.2的解决方案。
我当前的设置将返回“VowelFaceXX”IBOutlets的随机标题,但通常会重复结果。我希望每个IBOutlet都有一个独特的结果。
理想情况下,我希望能够在以后的数组中拥有超过5个元素,但保留5个IBOutlets。
我已经发布了以下代码:
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)
}
}
正如@vadian建议的那样,洗牌vowelArray
。
let vowelFaces = [vowelFace01, vowelFace02, vowelFace03, vowelFace04, vowelFace05]
for (vowelFace, vowel) in zip(vowelFaces, vowelArray.shuffled()) {
vowelFace?.setTitle(vowel, for: .normal)
}
zip
允许您枚举一对序列,以最短的长度停止,这在这种情况下非常方便。