Site icon AppTractor

Я заменил все != nil в своем Swift-коде

Как и большинство разработчиков, я тысячи раз писал if someValue != nil на Swift, ни секунды не задумываясь. Это было быстро, привычно и ощущалось безопасным.

Но затем, во время плановой чистки кода, я решился на смелый поступок: удалил все вхождения != nil в iOS-проекте среднего размера и заменил их более выразительными конструкциями.

Что произошло дальше?

Мой линтер был доволен, ошибки исчезли, и я извлёк несколько уроков.

Давайте разберёмся.

Почему != nil (обычно) плохо пахнет

На первый взгляд, != nil кажется очевидной и читабельной проверкой. Но в Swift — языке, разработанном с учётом optional — этот шаблон на самом деле работает против читаемости и безопасности.

Вот почему:

Пример:

if user != nil {
    print(user!.name)
}

Технически это правильно, но скрывает истинную цель — вы выводите имя только в том случае, если пользователь существует, и принудительно разворачиваете его.

Лучшие альтернативы

Swift предлагает нам несколько более понятных, безопасных и элегантных способов работы с опциональными переменными. Вот что я использовал вместо != nil:

1. if let — классика

if let user = user {
    print(user.name)
}

Гораздо понятнее, не нужно принудительно разворачивать.

2. guard let — для ранних выходов

guard let user = user else {
    return
}
print(user.name)

Делает поток управления более явным и уменьшает количество вложенных блоков.

3. Опциональная цепочка

Optional chaining — это последовательность вызовов, где каждый шаг может вернуть nil, и если хотя бы одно звено цепи возвращает nil, то вся цепочка также возвращает nil. Это позволяет избегать ошибок принудительной распаковки опционалов и упрощает работу с вложенными структурами и классами.

print(user?.name)

Идеально подходит для коротких сообщений. Чёткий, лаконичный и безопасный код.

4. Функциональный стиль: map, flatMap и т.д.

user.map { print($0.name) }

Отлично подходит для создания логических цепочек без прерывания потока кода.

Примеры до и после рефакторинга

До:

if someValue != nil {
    process(someValue!)
}

После:

if let value = someValue {
    process(value)
}

До:

if item?.price != nil {
    total += item!.price!
}

После:

if let price = item?.price {
    total += price
}

Это небольшие изменения, но в совокупности они значительно улучшают код.

Неожиданные проблемы, которые я обнаружил

Заменив != nil, я непреднамеренно выявил несколько логических ошибок, где:

Это не только сделало код красивее, но и безопаснее.

Советы по линтингу

Хотите предотвратить использование != nil в своей кодовой базе? Используйте SwiftLint с пользовательским правилом, например:

custom_rules:
  no_explicit_nil_check:
    included: ".swift"
    name: "Avoid using '!= nil'"
    regex: "!=\\s*nil"
    message: "Use optional binding or chaining instead."
    severity: warning

Это помогло нашей команде выработать более эффективные навыки работы с optional.

Источник

Exit mobile version