Быстрая хорошая практика кодирования: если инструкция с дополнительным типом 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 } 

3 Solutions collect form web for “Быстрая хорошая практика кодирования: если инструкция с дополнительным типом Bool”

Это известная проблема, которая отслеживается в репозитории 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) 

С уважением

  • IBOutlets, не отображаемые на XCode 6.1 (6A1052d)
  • Как установить iOS 7.0 и iOS 8.0 в Xcode 6.1?
  • Как удалить исходные данные и очистить проект в Xcode 5 и Xcode 6?
  • Можно ли выровнять 3 вида бок о бок с одинаковой шириной в автоматическом макете только с помощью interfacebuilder?
  • Что означает initImageAppleJPEG: возврат к предупреждающим сообщениям libJPEG означает?
  • iOS: xcodebuild: error: Рабочая область '' не содержит схемы с именем ''
  • Xcode может использовать только рефакторинг C и Objective-C. Как переименовать название быстрого слова в Xcode 6?
  • Выберите ветку на боксе Xcode 6
  • MKMapView показывает пробел в выборе аннотации iOS8
  • Переходный делегат для анимации UITabBarController
  • Сбой приложения Swift с «непризнанным селектором, отправленным в экземпляр» на CLLocationManager
  • Interesting Posts

    UIScrollView со включенными страницами и изменениями вращения / ориентации устройства (MADNESS)

    Тени в SceneKit

    ExtAudioFileWrite для m4a / aac, не работающих на двухъядерных устройствах (ipad 2, iphone 4s)

    Разница между DispatchQueue.main.async и DispatchQueue.main.sync

    Swift iOS doesRelativeDateFormatting имеет разные значения, кроме «Сегодня» и «Вчера»?

    Объявления из расширений нельзя переопределить в Swift 4

    Как инициализировать универсальный изменяемый массив в Swift?

    Как получить доступ к свойствам в нескольких пользовательских табличных видах

    Увеличить изображение, используя автоматическую компоновку в прокрутке. Как центрировать?

    tableViewCell не прокручивается при редактировании текстового поля в iOS11

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

    Cocos2d – как заставить отдельные частицы следовать за слоем, а не с эмиттером?

    Изменение цвета значка удаления по умолчанию в режиме таблицы

    направление градиента слева направо

    Лучшая практика для написания ресурса из двух разных процессов в объективе-c

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.