2016-07-30 2 views
1

Я понятия не имею, почему я получаю эту ошибку.ошибка сегментации 11 в swift2

Код проблема здесь

for i in 0..<itemDataJson?.count { 
     imageUrls.append(appDelegate.itemDataJson![i]["image_url"].string!) 
} 

Когда я print(itemDataJson?.count) печатает Факультативно (1). Что я делаю неправильно?

спасибо.

ответ

1

Это печать Необязательно (1), потому что переменная itemDataJson имеет значение NULL, поэтому счет должен быть нулевым, потому что мы не знаем, имеет ли значение itemDataJson значение.

Основная проблема, которую я вижу в вашем коде, заключается в том, что вы являетесь переменными для развертывания силы. Принудительная разворачивание переменной - это запах кода (обычно, хотя я делаю это сам время от времени, но вам нужно быть осторожным).

Когда вы принудительно разворачиваете переменную, вам нужно задать себе вопрос: «Я хочу, чтобы приложение разбилось здесь, если эта переменная равна нулю?». Если ответ «да», то использование разворота силы допустимо, в противном случае вы должны создать переменную, не подлежащую обнулению или если это невозможно, вы должны использовать оператор guard в быстром.

Это может быть использовано, как это:

guard let itemDataJson = itemDataJson else { 
    // itemDataJson was null do something 
    return 
} 

Вы можете использовать if let конструкцию, как хорошо, но будьте осторожны пирамиды обреченности, если вы не используете if let конструкцию правильно. См. here для правильного использования, или используйте инструкцию охраны.

Я бы порекомендовал проверить документацию на optionals, если вы еще этого не сделали.

+0

Спасибо! Это идеальное объяснение! – hanachan1026

0

Я хотел бы изменить код этой версии:

if (itemDataJson != nil) { 
    for i in 0..<itemDataJson!.count { 
     imageUrls.append(appDelegate.itemDataJson![i]["image_url"].string!) 
    } 
} 
+0

Вместо того, чтобы проверять нуль, а затем использовать развертку силы «!», Вы должны использовать «if let»: 'if let count = itemDataJson? .count {' –

-2

вместо проверки на ноль, вы должны попробовать это.

if let item = itemDataJson { 
    for i in 0..<item.count { 
     imageUrls.append(appDelegate.itemDataJson![i]["image_url"].string!) 
    } 
} 
+0

Это может все еще вызвать ошибку сегментации, поскольку вы разворачиваете ' itemDataJson' и 'string' неявно. Используйте 'if let' для всех распаковки. –

0

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

if let itemDataJSON = itemDataJSON { 
    for i in 0..<itemDataJSON.count { 
     if let items = appDelegate.itemDataJSON { 
      if let imageURL = items[i]["imageURL"].string { 
       imageUrls.append(imageURL) 
      } 
     } 
    } 
} 

Кроме того, это плохая практика для хранения данных в AppDelegate. Вы должны создать свой собственный уровень данных, который не зависит от AppDelegate, чтобы сделать обработку данных более эффективной и легкой.

+0

Большое вам спасибо! – hanachan1026

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