2016-11-22 2 views
0

Попытки сделать загрузчик с помощью анимационного корыта этого кода:Swift: «неожиданно нашел ноль в то время как разворачивание необязательного значения» в массиве добавить

 var images: [UIImage] = [] 
     for i in 1...10 
     { 
      let strImageName : String = "loader\(i).png" 
      images.append(UIImage(named: strImageName)!) 
     } 
     self.loader.animationImages = images 
     self.loader.animationDuration = 1.0 
     self.loader.startAnimating() 

Я получил эту фатальную ошибку об ошибке: «неожиданно нашел ноль в то время как разворачивание Дополнительное значение Затем мое приложение разбился», и те, информация из отладчика после аварии:

images = ([UImage]) 0 values 
strImageName = (String) “loader1.png” 

Я не могу понять, что это неправильно в моем коде. Может ли кто-нибудь мне помочь?

+2

Возможный дубликат [Что делает «фатальная ошибка: неожиданно найденная нуль при развертывании необязательного значения» означает?] (Http://stackoverflow.com/questions/32170456/what-does-fatal-error-unexpectedly-found- nil-while-unwrapping-an-optional-valu) – Idan

+7

'UIImage (named: strImageName)!' означает «пожалуйста, отключите мое приложение, если это изображение не существует», и это то, что происходит. Не заставляйте разворачивать, обрабатывать ошибки ... – Moritz

+0

https://i.imgflip.com/utfq7.jpg – fpg1503

ответ

2

Что происходит, что инициализатор UIImage «s является failable и изображение, которое вы пытаетесь создать не может быть найден так заставить разворачивание аварии. Вы должны условно разворачивать (т.е. if let):

var images: [UIImage] = [] 
for i in 1...10 { 
    let strImageName = "loader\(i).png" 
    if let image = UIImage(named: strImageName) { 
     images.append(image) 
    } else { 
     print("Image '\(strImageName)' does not exist!") 
    } 
} 
self.loader.animationImages = images 
self.loader.animationDuration = 1.0 
self.loader.startAnimating() 

Вы также можете сделать это в одной строке с помощью map/flatMap:

let images = (1...10).map { "loader\($0).png" }.map { UIImage(named: $0) }.flatMap { $0 } 
+1

'(1 ... 10) .map' без нажатия на' Array' тоже будет работать. – user28434

1

Для надежной разворачивания необходимо использовать конструкцию if let, поскольку инициализатор UIImage не работает.

public /*not inherited*/ init?(named name: String) 

Именованный файл. Если это первый раз, когда изображение загружается, метод ищет изображение с указанным именем в главном комплекте приложения.

Возвращаемое значение - Объект изображения для указанного файла, или nil, если метод не смог найти указанное изображение.

let strImageName = "loader\(i).png" 

if let image = UIImage(named: strImageName) { 
    images.append(image) 
} 
0

Swift Руководство компании Apple: Косвенно развернутые OPTIONALS не следует использовать когда есть возможность того, что переменная становится нулевой в более поздней точке. Всегда используйте обычный необязательный тип, если вам нужно проверить значение nil в течение жизни переменной.

+1

За исключением того, что OP не использует неявно развернутую опцию, они просто принудительно разворачивают обычную опцию. – Moritz

Смежные вопросы

 Смежные вопросы