Что за странные сообщения говорит компилятор Swift о Bool ("")? - PullRequest
0 голосов
/ 10 мая 2019

Приходите из python и протестируйте Swift с пустой строкой в ​​качестве условия оператора if.

  1. Что означают сообщения об ошибках?
    if Bool("") {} дает три сообщения компилятора

    • error: value of optional type 'Bool?' must be unwrapped to a value of type 'Bool'
    • note: coalesce using '??' to provide a default when the optional value contains 'nil'
    • note: force-unwrap using '!' to abort execution if the optional value contains 'nil'
  2. Какая польза от этого поведения?
    Bool("") возврат nil
    какова цель сделать его таким?

1 Ответ

2 голосов
/ 10 мая 2019

На самом деле это не 3 сообщения об ошибках.Это 1 сообщение об ошибке, плюс 2 предложенных способа его решения.

Условие в операторе if должно быть Bool, но у вас есть выражение Bool("") типа Bool?.,Компилятор видит, что это просто Bool, завернутый в необязательный элемент, поэтому он предлагает способы развернуть необязательный элемент, чтобы получить тип, ожидаемый оператором if - Bool.

.Первый предложенный способ - указать значение по умолчанию для Bool(""), равное nil, используя оператор ??] 1 , например:

if Bool("") ?? true {}

Второй способ:Принудительно разверните его, по сути, аварийно завершив работу программы, если Bool("") равен nil:

if Bool("")! {}

Хотя в этом случае оба эти способа исправить это довольно глупо, поскольку Bool("") всегда равно нулю.Но дело в том, что это два способа, которые предложит компилятор, когда вам нужно развернуть необязательный.

Переходя ко второму вопросу, почему Bool.init возвращает необязательный?

Инициализаторы могут возвращать nil, поскольку они могут давать сбой , и эти инициализаторы называются сбойными инициализаторами .Инициализация Bool с помощью String может завершиться неудачно, поскольку только строки "true" и "false" будут успешно создавать Bool s.Все остальные строки не представляют значения Bool.

...