Каковы существенные различия в реализации, которые делают Optional
более безопасным, чем nil
, и как это повлияет на мой код?
Что делает Swift "Необязательно" более безопасным, чем Objective-C "nil"?
Ответ 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 (что очень плохо). Напротив, быстрый предотвращает сценарий, когда значение объекта неизвестно.