Swift 2 загрузить изображение из ошибки переменной URL

У меня есть функция load_image и работает с

load_image("http://blabla.com/bla.png")

Но когда я добавляю переменную, как это

 load_image(detailDesc2!)

дает эту ошибку

fatal error: unexpectedly found nil while unwrapping an Optional value

Мои коды здесь

ViewController таблица просмотра выбранных кодов. Здесь отправьте detailDesc1 и detailDesc 2 в контроллер DetailView

  func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        let subcatVC = self.storyboard?.instantiateViewControllerWithIdentifier("Detail") as! DetailViewController
        subcatVC.detailDesc1 = self.arrayCategory[indexPath.row][API_PARAM_CAT_ID] as! String
        subcatVC.detailDesc2 = self.arrayCategory[indexPath.row][API_PARAM_CAT_IMAGE] as! String
        _ = UINavigationController(rootViewController: subcatVC)
        self.navigationController?.pushViewController(subcatVC, animated: false)
    }

DetailViewController

   var detailDesc1:String?
    var detailDesc2:String?

    load_image(detailDesc2!)  // HERE GIVES ERROR

Моя функция load_image

func load_image(urlString:String)
{
    let imgURL: NSURL = NSURL(string: urlString)!
    let request: NSURLRequest = NSURLRequest(URL: imgURL)

    let session = NSURLSession.sharedSession()
    let task = session.dataTaskWithRequest(request){
        (data, response, error) -> Void in

        if (error == nil && data != nil)
        {
            func display_image()
            {
                self.imagetbig.image = UIImage(data: data!)
            }

            dispatch_async(dispatch_get_main_queue(), display_image)
        }

    }

    task.resume()
}

Кроме того, когда я добавляю этот код, успех показывает лейбл и текстовые представления.

textbig.text = detailDesc1
textim.text = detailDesc2

2 ответа

Решение

По какой-то причине ваша переменная detailDesc2 является nil и вы заставляете распаковку, используя ! сообщая компилятору, что переменная всегда имеет значение, когда переменная была объявлена ​​необязательной (это может быть не значение). По словам Apple:

Пытаюсь использовать! доступ к несуществующему необязательному значению вызывает ошибку времени выполнения. Всегда убедитесь, что необязательный параметр содержит ненулевое значение перед использованием! принудительно развернуть его значение.

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

if let url = detailDesc2 {
    load_image(url)
}

Как сейчас рекомендует @LeoDabus в Swift 2, вы также можете использовать guard Утверждение, что вы можете использовать как следующим образом:

guard if let url = detailDesc2 else {
   return 
}

load_image(url)

По словам Apple:

Оператор guard, как и оператор if, выполняет операторы в зависимости от логического значения выражения. Вы используете оператор защиты, чтобы требовать, чтобы условие было истинным, чтобы код после оператора охраны был выполнен. В отличие от оператора if, оператор guard всегда имеет предложение else - код внутри предложения else выполняется, если условие не выполнено.

Я надеюсь, что это поможет вам.

Я жду self.arrayCategory[indexPath.row][API_PARAM_CAT_IMAGE] возвращает ноль

Вы можете проверить переменную перед использованием:

if let imageUrl = detailDesc2 {
    load_image(imageUrl)
}
Другие вопросы по тегам