Вы не можете программно получить файл .xcassets во время выполнения. Я также работаю над подобной задачей, решение, которое я придумал, очень простое. Изображения называются с использованием следующего соглашения: imageNameAndIdentifier (например: heart0, heart1, heart2 и т. Д.). Используя цикл, в котором построено полное имя изображения и создается UIImage, я получаю все необходимые изображения.
let stickerName = "heart"
var images = [UIImage]()
var lastImageIndex = 0
lastImageIndex = lastStickerImageIndex(name: stickerName)
for index in 0...lastImageIndex {
images.append(UIImage.init(named: stickerName + "\(index)"))
}
Обратите внимание: lastImageIndex
переменная. Это значение рассчитывается на основе количества файлов, которое содержит в имени файла заданную строку и вычитает одну единицу, поскольку последний индекс = (length_of_array - 1).
private func lastStickerImageIndex(name: String) -> Int {
return (FileManager.default.numberOfFilesWhichNameContains(string: name) - 1)
}
Я создал расширение, которое возвращает количество файлов на основе строки, которая должна содержаться в желаемом имени файла.
extension FileManager {
func numberOfFilesWhichNameContains(string: String) -> Int {
do {
let bundleFiles = try self.contentsOfDirectory(atPath: Bundle.main.bundlePath)
let filteredBundleFiles = bundleFiles.filter({
$0.contains(string)
})
return filteredBundleFiles.count
} catch let error {
print(error)
}
return 0
}
}
Концептуально я понимаю, но как бы это сделать в Swift? Я пробовал адаптировать код для работы в рамках своего проекта, и он выплевывает массу забавных ошибок. –