Подтвердить что ты не робот

Swift: создание массива UIImage

Используя Swift, я пытаюсь создать массив объектов UIImage для простой анимации. Контекстная помощь для animationImages читает: "Массив должен содержать объекты изображения пользовательского интерфейса".

Я попытался создать указанный массив следующим образом, но, похоже, не верю в синтаксис:

var logoImages: UIImage[]
logoImages[0] = UIImage(name: "logo.png")

Это бросает: ! Переменные logoImages, используемые до инициализации

Затем я попробовал

var logoImages = []
logoImages[0] = UIImage(named: "logo.png")

Что бросает: ! Невозможно присвоить результат этого выражения

Я проверил документы здесь, но контекст не то же самое: https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/CollectionTypes.html

4b9b3361

Ответ 1

У вас есть две проблемы (и без регулярного выражения!)

1. Вы не создаете массив. Вам нужно сделать:

var logoImages: [UIImage] = []

или

var logoImages: Array<UIImage> = []

или

var logoImages = [UIImage]()

или

var logoImages = Array<UIImage>()

2. Если вы хотите добавить новые объекты в массив, вы должны использовать Array.append() или некоторый эквивалентный синтаксический сахар:

logoImages.append(UIImage(named: "logo.png")!)

или

logoImages += [UIImage(named: "logo.png")!]

или

logoImages += [UIImage(named: "logo.png")!, UIImage(named: "logo2.png")!]

Вам нужно добавить к массиву, потому что (excerpt из документов):

Вы не можете использовать синтаксис индекса, чтобы добавить новый элемент в конец массив. Если вы попытаетесь использовать синтаксис индекса для извлечения или установки значения для индекса, который находится за пределами существующих границ массивов, вы будете вызвать ошибку времени выполнения. Однако вы можете проверить, что индекс действителен перед использованием, сравнивая его со свойством count массива. Кроме когда count равно 0 (это означает, что массив пуст), наибольший допустимый индекс в массиве всегда будет count - 1, потому что массивы индексируются из нуль.

Конечно, вы всегда можете упростить его, если это возможно:

var logoImage: [UIImage] = [
    UIImage(named: "logo1.png")!,
    UIImage(named: "logo2.png")!
]

edit: Обратите внимание, что UIImage теперь имеет "failable" инициализатор, что означает, что он возвращает необязательный. Я обновил все биты кода, чтобы отразить это изменение, а также изменения в синтаксисе массива.

Ответ 2

Вы объявляете тип для logoImages, но не создаете экземпляр этого типа.

Используйте var logoImages = UIImage[](), который создаст для вас новый массив.

... а затем после создания нового пустого экземпляра Array, как описано в ответе @Jiaaro, вы не можете использовать subscript для добавления в пустой массив

Ответ 3

var image : UIImage = UIImage(named:"logo.png")    
var logoImages = [image]