2016-02-28 2 views
0

У меня возникли проблемы с пониманием того, как я должен использовать необязательные переменные. Должен ли я проверять нуль во всем моем коде для предотвращения сбоев? Например, с помощью этого кодаПонимание дополнительных с Swift 2.0

let pubHead = "Publisher: " 
    if let pubName : String? = self.book?.publisher { 
      self.publisherLabel?.text = pubHead+pubName! 
     } 

book.publisher переменная не является обязательным, так что он может или не может быть нулевым, если не ноль этот код отлично работает, строка добавляется и установить на лейбла текст. Однако я получаю фатальную ошибку, когда она равна нулю. Нужно ли мне проверять нуль во всем моем коде, чтобы предотвратить сбои в подобных случаях с этим. Если да, то каков правильный способ проверить нуль?

+1

Optionals являются основной концепцией в Swift. Это гораздо больше, чем оператор 'if let'. Прочтите соответствующий раздел в [Руководстве по быстрому языку] (https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/TheBasics.html) – vadian

ответ

0

Чтобы объяснить ошибки, которые вы видите, то if let конструкция имеет следующий синтаксис

if let (x: Type) = (expression of Type?) 

Это означает, что если вы хотите, чтобы проверить, является ли String? это nil, вы будете иметь String на левой стороне (левая сторона больше не является обязательным).

Однако, если вы написали String? с левой стороны, выражение с правой стороны должно быть String??.

Другими словами, self.book?.publisher имеет тип String? (Optional<String>), но поместив его в:

if let pubName : String? = self.book?.publisher { 

он станет String?? (Optional<Optional<String>>).

if let затем правильно удаляет один уровень опциона, и вы получите String?.

Очевидно, что вы хотите

if let pubname: String = self.book?.publisher 

или пусть типа будет выведено

if let pubname = self.book?.publisher 
Смежные вопросы