Быстрая хорошая практика кодирования: если инструкция с дополнительным типом Bool

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

if (hero.isAI) { //isAI is a Bool } 

Проблема заключалась в том, что этот оператор if ALWAYS вернул true. Поэтому я подумал, что, возможно, я устанавливал isAI в true, но в конце я понял, что объявил isAI как необязательный тип, как показано ниже.

 var isAI: Bool! 

когда это должно было быть

 var isAI: Bool 

Это привело к тому, что if-statement не проверял, является ли isAI истинным, но вместо этого проверяет, содержит ли оно значение.

Поэтому, чтобы быть в безопасности, я обязательно напишу свои if-statments как это

 if (hero.isAI == true) { //isAI is a Bool } 

Поэтому мой вопрос: каковы мои варианты, чтобы избежать этой проблемы в будущем? (эта проблема кажется чрезвычайно опасной, особенно при работе над командой по крупному проекту). Должен ли я всегда писать свой if-statment явно, должен ли я просто избегать необязательного типа для Bools?

Обратите внимание, что у меня не было этой проблемы в Xcode Beta 2. Эта проблема возникла, когда я обновился до Xcode beta 3. Я думаю, потому что в Beta 2 Apple обрабатывает неявно развернутый Bool в if-statement, проверяя его значение, а не проверяя, содержит значение.

Наконец, ниже приведен пример того, какие if-утверждения выполняются с использованием дополнительного Bool, чтобы лучше помочь людям понять проблему.

 let myBool: Bool! = false if (myBool) { //Runs } if (myBool!) { //Won't Run } if (!myBool) { //Runs } if (myBool == true) { //Won't Run } 

Это известная проблема, которая отслеживается в репозитории SwiftInFlux , которая включает эту цитату из Chris Lattner на форумах разработчиков Apple .

Эта проблема существует с любым необязательным чем-то, что соответствует протоколу LogicValue (например, вложенные опции, необязательные для bool и т. Д.). Мы считаем это серьезной проблемой, которая должна быть исправлена ​​для 1.0 и иметь некоторые идеи, но пока не решила решение.

Таким образом, эта проблема не просто влияет на необязательные Bools, но и на любой необязательный тип, который соответствует протоколу LogicValue (определенному как).

 protocol LogicValue { func getLogicValue() -> Bool } 

В любом случае, поскольку рекомендации относительно того, как обойти это, трудно рекомендовать какое-либо конкретное решение, учитывая, что Apple не указала, как они намереваются решить это в будущем, но я бы предположил, что продолжение явной проверки ценность Bool – это путь.

 if (hero.isAI == true) { // stuff } 

Фактически, после некоторого дальнейшего чтения приведенная выше цитата продолжает читать:

Для этого общего случая самым простым ответом было бы дать предупреждение для «if x» и потребовать, чтобы кто-то явно написал «if x! = Nil» или «if x == true», чтобы сделать его явным, что они хотят.

мой совет – использовать этот хороший коалесцинг ??

 if textfieldDate.text?.isEmpty ?? true { // the text is either nil or empty but its all we want to know } 

Если bool является частью Core Data (aka NSNumber), вы должны сделать это так.

 if (isHero.isAI?.boolValue != nil) 

С уважением

  • Тестирование блоков XCode 6 без построения
  • Когда использовать didMoveToView или initWithSize с помощью SpriteKit в xCode 6.4
  • Любой-Любой класс размера игнорируется для ios7
  • WatchKit SDK не извлекает данные из NSUserDefaults
  • Симулятор Xcode 6, неспособный загрузить ошибку
  • Добавление основных данных в существующее приложение с вкладками (ios swift, Xcode6)
  • Swift: память не очищается, когда я перехожу к другому контроллеру представления, получая предупреждение памяти
  • Xcode6 Не удалось проанализировать ответ сервера как plist
  • Ошибка кодирования кода XCode XCTest
  • setPreferredContentSize не работает в сегодняшнем виджетах в ландшафтном iPhone на iOS8
  • добавление зависимостей cocoapod к структуре какао-touch
  • Давайте будем гением компьютера.