В КУРСЕ?

Разбираемся в теме

Ноль или неизвестно: почему Swift заставляет различать эти состояния

Учебное приложение показывает, через сколько дней ожидается доставка. Значение ноль означает сегодня, три — через три дня, а отсутствие данных означает, что срок неизвестен. Если все отсутствующие значения заменить нулём, приложение начнёт обещать доставку сегодня без основания. В Swift различать такие ситуации помогают optional, или опциональные значения.

Отсутствие значения не является ещё одним числом

Опциональное целое число может содержать целое число либо не содержать значения. Во втором случае используется nil. Это не специальный вариант нуля и не отрицательное число. Тип заранее показывает, что программе предстоит обработать отсутствие данных. В примере с доставкой ноль и три принадлежат к числовой части модели. Неизвестный срок находится в другом состоянии. При этом nil сам по себе не объясняет причину отсутствия: ответ мог ещё не прийти, сведения могли не быть заполнены или возникла другая ситуация. Если причины важны для поведения приложения, их нужно представлять отдельно.

Подстановка по умолчанию должна сохранять смысл

Запасное значение удобно только тогда, когда оно действительно допустимо для задачи. Для отсутствующего пояснения можно выбрать нейтральную подпись, а для неизвестного срока показать, что он уточняется. Но автоматически подставить ноль и затем трактовать его как подтверждённый срок — значит изменить содержание данных. Представим два экрана. Первый сообщает, что срок пока неизвестен. Второй показывает сегодня, потому что разработчик хотел убрать пустое место. Внешне второй экран выглядит завершённым, однако сообщает больше, чем известно программе. Аккуратная работа с отсутствием данных касается честности интерфейса, а не только удобства синтаксиса.

Получайте значение только после проверки его наличия

В Swift опциональная привязка позволяет выполнить подходящую ветку, если значение присутствует. Для отсутствующего значения предусматривают другую ветку поведения. Так обработка числа отделяется от решения, что делать без него. Принудительное извлечение значения не создаёт отсутствующее число. Если выполнить такое извлечение для nil, возникнет ошибка времени выполнения. Поэтому символ, обещающий наличие значения, не является универсальным исправлением замечания компилятора. Сначала нужен ответ на вопрос, почему наличие действительно гарантировано. Для учебной задачи достаточно сохранить два пути: показать известный срок или ясно обозначить отсутствие сведений.

Попробуйте на практике

Спроектируйте поведение экрана доставки на бумаге. Не пишите программу и не используйте реальные заказы: упражнение проверяет модель данных.

  1. Создайте три карточки: срок равен нулю, срок равен трём, срок отсутствует. Подпишите, какие карточки содержат число, а какая не содержит значения.
  2. Для каждой карточки напишите отдельное сообщение экрана. Сохраните различие между доставкой сегодня и неизвестным сроком.
  3. Проверьте ошибочное правило: любой отсутствующий срок заменяется нулём. Укажите, какие две разные карточки теперь дают одинаковое сообщение и какая информация потеряна.
  4. Нарисуйте развилку по наличию значения. В числовой ветке обработайте ноль и три, в другой покажите отсутствие сведений без выдуманной причины.

Как проверить результат. Результат верен, если неизвестный срок нигде не превращается в подтверждённый ноль. Числовые значения должны оставаться доступными для своей ветки, а отсутствие данных должно иметь понятное самостоятельное отображение.

Частые вопросы

Nil всегда означает ошибку сервера?

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

Значение по умолчанию всегда вредно?

Нет. Оно полезно, когда соответствует смыслу задачи. Ошибка возникает, если удобная подстановка выдаёт неизвестные сведения за подтверждённый факт, как в примере с доставкой сегодня.

Самостоятельный разбор темы. Содержание конкретной обучающей программы здесь не представлено.

Зарегистрируйтесь, чтобы уточнить возможность доступа к этому материалу

Зарегистрироваться
← К списку материалов