I created a struct
called Images
Where you pass an array of UIImage
And then you can call your getRandomImageNotUsed
method to have an unused image of the array returned
Once all the images have been used, calling getRandomImageNotUsed
will return you nil.
Demo:
var image1 = UIImage()
var image2 = UIImage()
var image3 = UIImage()
var image4 = UIImage()
// le asigno nombres para proposito
// de demostrarte el demo.
image1.accessibilityIdentifier = "image1"
image2.accessibilityIdentifier = "image2"
image3.accessibilityIdentifier = "image3"
image4.accessibilityIdentifier = "image4"
var images = Images(images: [image1, image2, image3, image4])
var randomImage1 = images.getRandomImageNotUsed()
var randomImage2 = images.getRandomImageNotUsed()
var randomImage3 = images.getRandomImageNotUsed()
var randomImage4 = images.getRandomImageNotUsed()
print(randomImage1?.accessibilityIdentifier)
print(randomImage2?.accessibilityIdentifier)
print(randomImage3?.accessibilityIdentifier)
print(randomImage4?.accessibilityIdentifier)
var randomImage5 = images.getRandomImageNotUsed()
print(randomImage5)
Output of running twice the code above:
Optional("image1")
Optional("image3")
Optional("image4")
Optional("image2")
nil
Optional("image2")
Optional("image3")
Optional("image4")
Optional("image1")
nil
Source Code of Images struct:
import UIKit
struct Images {
private var images: [UIImage]
private var unusedImageIndexes: [Int]
init(images: [UIImage]) {
self.images = images
self.unusedImageIndexes = Array(0...images.count - 1)
}
mutating func getRandomImageNotUsed() -> UIImage? {
if unusedImageIndexes.count > 0 {
let randomValue = Int(arc4random_uniform(UInt32(unusedImageIndexes.count)))
let randomIndex = unusedImageIndexes[randomValue]
unusedImageIndexes.remove(at: randomValue)
return images[randomIndex]
} else {
return nil
}
}
}
I hope it serves you something in your problem, let me know if you need any clarification of my humble solution, Greetings partner!