Быстрая хорошая практика кодирования: если инструкция с дополнительным типом 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 - автоматический макет
  • Xcode 6 Неизвестный класс ViewController в файле Interface Builder
  • Добавление тестера Sandbox в itunes подключается к существующей учетной записи Apple
  • Как заставить изображения запуска вместо запуска экрана на iOS 8?
  • ERROR ITMS-9000: «Неподдерживаемые архитектуры. Ваш исполняемый файл содержит неподдерживаемые архитектуры '"
  • iOS Crash: libswiftAssetsLibrary.dylib не загружен
  • Добавить пользовательский путь в HEADER_SEARCH_PATHS с помощью CocoaPods post install hook
  • Что означает initImageAppleJPEG: возврат к предупреждающим сообщениям libJPEG означает?
  • Подпрограммы UITableViewCell отображают неверную ширину при использовании классов размера
  • Xcode6: запустить два экземпляра симулятора
  • Xcode 6.4 iOS 8.4 Проблема с оформлением iPhone 6
  • Давайте будем гением компьютера.