Подтвердить что ты не робот

Что делает Swift "Необязательно" более безопасным, чем Objective-C "nil"?

Apple, похоже, утверждает, что тип Optional в Swift более безопасен, чем nil в Objective-C, но я не понять, почему это так.

Каковы существенные различия в реализации, которые делают Optional более безопасным, чем nil, и как это повлияет на мой код?

4b9b3361

Ответ 1

Я всегда проверяю, есть ли переменная nil, прежде чем использовать ее, чтобы избежать проблем. Тем не менее, по-прежнему происходит некоторое время, что значение может прийти как nil, к моему удивлению, или иногда просто забываю проверить.

После того, как я все больше кода в Swift, я обнаружил, что использование необязательных переменных действительно обеспечивает много удобства, чтобы избежать игнорирования проверки значений nil. Я действительно не помню никаких сбоев из-за доступа к переменной nil (если только я не принудительно разворачиваю некоторую переменную, поэтому не делайте разворачивания силы, если вы не знаете, что делаете).

Кроме того, я использовал много таких кодов во многих местах:

if (obj != nil) {
    obj.property = ...
}

Теперь я могу просто сделать это как

 obj?.property = ...

Теперь код выглядит чистым и резким. Вам тоже не нравится?

Ответ 2

Он становится "безопасным", потому что он заставляет программиста писать более явный код.

  • Синтаксис if let ... и guard явно говорит: "Делайте это только в том случае, если для этих переменных есть значения".
  • Синтаксис ! заставляет программу сбой, если переменная nil, когда программист не ожидал, что она будет nil.

Напротив, способ Objective-C совершать вызовы nil не может работать, пока программа не продолжит выполнение до такой точки, что nil неприемлема. Один общий пример - переменные nil NSString. Многие вызовы API довольны nil NSString, за исключением случаев, когда вы создаете NSAttributedString (он не примет параметр nil NSString и разбил ваше приложение). Следовательно, когда вы получаете переменную NSString неожиданно становится nil, это может произойти позже, пока ваше приложение не выйдет из строя, потому что оно пытается построить атрибутированную строку с этим значением nil.

Для более полной иллюстрации проблемы, которую Optionals попытался решить, рассмотрите этот пост с 2010 года Даниэль Ялкут. Это было написано задолго до Свифта.

Ответ 3

В общем, в программировании мы хотим избежать переменных, которые не имеют значения (null или nil), потому что использование их часто приводит к поведению undefined (исключения, ошибки, сбои).

Например, общепринятой практикой для ссылок Array является установка пустых массивов вместо nil. В пустом массиве мы можем использовать все методы Array, например. indexOf или count. Использование их на nil приведет к сбою.

Опционы позволяют нам указать, что некоторые переменные никогда не пусты, поэтому мы можем безопасно их использовать, а компилятор проверяет, что nil никогда не назначается им. Кроме того, компилятор гарантирует, что каждое преобразование из опций в non-optionals является явным (мы всегда проверяем nil при необходимости).

Таким образом, ответ будет следующим:

  • Обеспечьте хорошие методы программирования.
  • Разрешить лучшую проверку кода во время компиляции

Таким образом, предотвращение ошибок программирования.

Также обратите внимание, что вы всегда должны стараться избегать опций, когда это возможно. Наибольшая мощность опций - это тот факт, что большинство переменных не являются опциями.

Ответ 4

В Objective-C вы можете определить переменную без значения. Если вы хотите использовать эту переменную перед назначением значения, вы получите поведение undefined (что очень плохо). Напротив, быстрый предотвращает сценарий, когда значение объекта неизвестно.