Swift-команда без хаоса: code style и конвенции, которые спасут ваш проект

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Как не утонуть в чужом коде: введение в code style Swift

Представьте: вы открываете pull request коллеги, а там — let userName соседствует с let UserName, отступы прыгают от 2 до 8 пробелов, а фигурные скобки стоят то на той же строке, то на новой. Знакомо? Если ваша команда пишет на Swift, то рано или поздно вы столкнётесь с хаосом. Или уже столкнулись.

Работа в команде — это не про «как удобно мне», а про «как понятно всем». Code style и конвенции для Swift — это не бюрократия, а спасательный круг. Они экономят часы на код-ревью, снижают количество багов и делают код читаемым даже через полгода. В этой статье я расскажу, какие правила реально работают, покажу примеры на Swift и дам чек-лист для внедрения в вашей команде. Поехали!

Почему без code style Swift превращается в ад

Swift — язык молодой, но строгий. Он сам подталкивает к аккуратности: опционалы, дженерики, протоколы. Но без договорённостей внутри команды даже идеальный синтаксис не спасёт. Вот три причины, почему Swift code style нужен каждому проекту:

  • Скорость онбординга. Новый разработчик тратит дни на изучение не логики, а «а где тут что лежит».
  • Код-ревью. Вместо обсуждения архитектуры вы спорите про пробелы. Знакомая боль?
  • Технический долг. Разный стиль — разная логика. Однажды это выстрелит в продакшене.

Хорошая новость: конвенции Swift уже придуманы. Осталось только договориться и автоматизировать.

Именование: Swift Naming Convention

Свифт — язык с чёткой философией: «ясность важнее краткости». Это значит, что getUserData() — плохо, а fetchUserProfile() — хорошо. Давайте разберём основные правила Swift naming convention.

Переменные и константы

Используйте camelCase с маленькой буквы. Называйте сущности так, чтобы было понятно без комментария:

// Плохо
let n = "Alice"
let u = 25

// Хорошо
let userName = "Alice"
let userAge = 25

// Отлично (с типом)
let isActiveUser: Bool = true

Для булевых переменных добавляйте префиксы is, has, should — это best practice Swift.

Функции и методы

Функции должны читаться как предложение. Глагол + существительное — золотое правило:

// Плохо
func change() { }
func processData() { }

// Хорошо
func updateUserProfile() { }
func validateEmailAddress() { }

// С параметрами — ещё читаемее
func configureButton(withTitle title: String, color: UIColor) { }

Обратите внимание: первый параметр часто опускают при вызове, но для читаемости лучше указывать явно. Это часть Swift code style guide от Apple.

Типы и протоколы

Классы, структуры, enum — PascalCase. Протоколы — тоже, но старайтесь делать их именами прилагательными:

class UserManager { }
struct UserProfile { }
enum NetworkError { }

protocol Configurable { }
protocol DataPersistable { }

Форматирование: дышите равномерно

Тема холиваров — отступы, скобки, пробелы. Давайте расставим точки над i. Для Swift code style я рекомендую придерживаться стандарта SwiftLint (о нём позже).

Фигурные скобки

Apple рекомендует ставить открывающую скобку на той же строке (K&R style). Закрывающая — на новой строке:

// Правильно
if isLoggedIn {
    showDashboard()
} else {
    showLoginScreen()
}

// Неправильно
if isLoggedIn
{
    showDashboard()
}

Исключение — замыкания. Там скобки могут быть на одной строке, если код короткий:

let sortedUsers = users.sorted { $0.age < $1.age }

Отступы и пробелы

Используйте 4 пробела (табуляцию — в настройках Xcode). Никаких 2 пробелов — это не JavaScript. Один пробел вокруг операторов и после двоеточия:

// Плохо
let sum=5+3
let dict:[String:Int]=[:]

// Хорошо
let sum = 5 + 3
let dict: [String: Int] = [:]

Длина строки

Старайтесь не превышать 120 символов. Xcode подсвечивает границу. Если строка длинная — переносите:

func fetchData(from url: URL,
               with parameters: [String: Any],
               completion: @escaping (Result<Data, Error>) -> Void) {
    // ...
}

Структура кода: порядок в файле

Работа в команде требует единой структуры файлов. Вот шаблон, который используют в крупных проектах на Swift:

  • MARK: разделители для навигации
  • Сначала свойства (статические, потом обычные)
  • Инициализаторы
  • Методы жизненного цикла (для UI)
  • Публичные методы
  • Приватные методы
  • Расширения для протоколов

Пример:

class ProfileViewController: UIViewController {

    // MARK: - Properties
    private let viewModel: ProfileViewModel
    private var isDataLoaded = false

    // MARK: - Initialization
    init(viewModel: ProfileViewModel) {
        self.viewModel = viewModel
        super.init(nibName: nil, bundle: nil)
    }

    // MARK: - Lifecycle
    override func viewDidLoad() {
        super.viewDidLoad()
        setupUI()
    }

    // MARK: - Public Methods
    func refreshData() {
        // ...
    }

    // MARK: - Private Methods
    private func setupUI() {
        // ...
    }
}

// MARK: - UITableViewDataSource
extension ProfileViewController: UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return viewModel.items.count
    }
}

Такой подход — основа Swift best practices для поддержки кода.

Автоматизация: SwiftLint и не только

Ручные проверки — прошлый век. Для code style Swift используйте инструменты:

  • SwiftLint — главный инструмент. Настраивается под ваши правила. Запускается в CI.
  • SwiftFormat — автоформатирование. Спасает от лишних споров.
  • Xcode templates — создайте шаблоны файлов с уже проставленными MARK.

Пример

Блоги

Рекомендаций по книгам