Каковы существенные различия в реализации, которые делают 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 (что очень плохо). Напротив, быстрый предотвращает сценарий, когда значение объекта неизвестно.