Как не утонуть в чужом коде: введение в 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.
Пример