2016-12-15 5 views
11

Приложенный скриншот говорит все: у меня есть действительный истинный Bool, я отрицаю его с помощью оператора bang, и (Xcode говорит мне) У меня есть недопустимое значение.Swift Логическое значение <invalid>

Похоже, что это «недопустимое» значение ведет себя так, как если бы оно было ложным. Но действительно, wtf?

enter image description here

+1

Память для этого bool либо не была инициализирована, либо была каким-то образом повреждена. Единственными допустимыми значениями для 'Bool' являются' 0x01' ('true') и' 0x00' ('false') – Alexander

+0

Окно отладки Xcode ясно показывает, что bool был инициализирован. Это то, что делает линия 72. Более того, значение 'enabled' не может быть оптимизировано, так как оно используется в строке 73. Однако это может быть просто ошибка отладчика Xcode ... –

+0

Я подозреваю, что этот код был отредактирован с момента запуска сеанса отладки и что код не отражает состояние программы – Alexander

ответ

0

Я не эксперт LLVM, но я не удивлюсь об этом поведении вообще, если оптимизация не установлен Onone в этом случае он должен был оставить свой код в одиночку. В конце концов, промежуточная переменная просто просит оптимизироваться.

+0

Однако (и я должен был указать это), как включенные, так и отключенные используются несколько раз позже в методе. (Это часть того, почему у меня есть * оба * включены и отключены определены: код читается лучше, и труднее непреднамеренно опустить символ отрицательного удара). Фактически, отладчик приостанавливается точно в одном из мест, где (по-видимому, фиктивный).Наконец, в режиме отладки мой оптимизационный параметр * - * - Только одно. –

+0

Я также объявляю переменные либерально, но независимо от того, насколько я их использую, я все еще ожидаю, что они исчезнут и заменятся чем-то намного лучше. Если ваш скриншот на самом деле является результатом отладки, который вы подразумеваете, то, боюсь, вам придется подождать, когда кто-нибудь станет более осведомленным. – Andreas

+0

Я согласен с тем, что компилятор может свободно изменять локальные переменные, если это возможно. (Я писатель-компилятор. Вы сочувствуете тому, сколько раз мне приходилось объяснять студентам, что «Нет, меньше местных жителей не означает более эффективный код».) Но да, скриншот отладчика Xcode. Может быть безобидной ошибкой во время выполнения Swift. Безвредный, потому что 0xfe (aka -2) действительно обрабатывался как ложный по потоку управления. –

1

Я был этот вопрос в Xcode 8.3.1 и Swift 3,1 https://github.com/onmyway133/notes/issues/278

Я попытался

  • Очистка папки сборки и удаления производный папку
  • данных удалить приложение
  • Сбросить тренажер
  • Restart Xcode
  • Restart Mac

Но не работает. Для устранения этой проблемы в

let enabled = disable ? false : true 
0

Получил тот же вопрос, с правильным значением для добавления кода, как print(theBoolValue).

Но при использовании p в быстрой командной строке. Или просто проверьте значение в стеке отладки, значение станет <invalid>(Oxfe).