SwiftFormat для Swift: полное руководство с примерами
Добро пожаловать на PythonLib! Сегодня мы разберём одну из самых полезных утилит для Swift-разработчиков — SwiftFormat. Это мощный инструмент для автоматического форматирования кода, который поможет вам поддерживать единый стиль в проекте, экономить время на code review и избегать типичных ошибок, связанных с расстановкой пробелов, скобок и отступов.
1. Что это и зачем нужна
SwiftFormat — это библиотека и командная утилита для автоматического форматирования исходного кода на языке Swift. Она анализирует ваш код и приводит его к заданному стилю, используя правила, которые можно настраивать под нужды команды. В отличие от линтеров (например, SwiftLint), которые только указывают на проблемы, SwiftFormat исправляет их автоматически.
Зачем это нужно? Во-первых, единообразие кода. Когда над проектом работает несколько разработчиков, каждый пишет в своём стиле. SwiftFormat приводит всё к общему знаменателю, что упрощает чтение и поддержку кода. Во-вторых, экономия времени: вместо того чтобы вручную править отступы или переносы строк, вы запускаете одну команду и получаете идеально отформатированный код. В-третьих, интеграция в CI/CD: вы можете добавить форматирование в пайплайн, чтобы гарантировать, что каждый коммит соответствует стандартам.
SwiftFormat поддерживает практически все версии Swift (от 4.0 до 5.x) и активно развивается сообществом. Он может работать как через командную строку, так и через Xcode (с помощью плагинов или встроенных скриптов).
2. Установка
SwiftFormat распространяется через несколько менеджеров пакетов. Вот основные способы установки:
Через Homebrew (рекомендуется для macOS)
brew install swiftformat
Через CocoaPods (для проектов iOS/macOS)
# Добавьте в Podfile:
pod 'SwiftFormat'
# Затем выполните:
pod install
Через Swift Package Manager (SPM)
// Добавьте в Package.swift:
dependencies: [
.package(url: "https://github.com/nicklockwood/SwiftFormat.git", from: "0.53.0")
]
Через Mint
mint install nicklockwood/SwiftFormat
После установки проверьте, что всё работает:
swiftformat --version
3. Быстрый старт — минимальный рабочий пример
Допустим, у вас есть файл example.swift с таким содержимым:
func hello(name:String)->String{
return "Hello, \(name)!"
}
Запустите SwiftFormat:
swiftformat example.swift
После выполнения файл будет выглядеть так:
func hello(name: String) -> String {
return "Hello, \(name)!"
}
Как видите, лишние пробелы удалены, добавлен пробел перед двоеточием, фигурная скобка перенесена на новую строку, и появился отступ. Всё автоматически!
Если нужно отформатировать всю папку с проектом:
swiftformat . --recursive
4. Основные методы/функции/классы
SwiftFormat предоставляет множество правил (rules) и опций для тонкой настройки. Рассмотрим 8 ключевых возможностей, которые вы будете использовать чаще всего.
4.1. Правило indent — настройка отступов
Сигнатура: --indent [tab|spaces] [число]
Что делает: Определяет, какие отступы использовать: табуляцию или пробелы, и сколько пробелов в одном уровне.
Пример:
swiftformat --indent spaces 4 example.swift
Результат: все отступы будут состоять из 4 пробелов.
4.2. Правило allman — стиль фигурных скобок
Сигнатура: --allman true/false
Что делает: Включает или отключает стиль Allman (скобка на новой строке). По умолчанию используется стиль K&R (скобка на той же строке).
Пример:
swiftformat --allman true example.swift
Исходный код:
if true {
print("Hello")
}
После форматирования:
if true
{
print("Hello")
}
4.3. Правило trailingCommas — запятые в конце строк
Сигнатура: --trailingcommas true/false
Что делает: Добавляет или удаляет запятые после последнего элемента в многострочных массивах/словарях. Это помогает избежать лишних изменений в diff при добавлении новых элементов.
Пример:
swiftformat --trailingcommas true example.swift
Исходный код:
let array = [
"one",
"two"
]
После форматирования:
let array = [
"one",
"two",
]
4.4. Правило stripHeaders — удаление комментариев-шапок
Сигнатура: --stripheaders true/false
Что делает: Удаляет стандартные комментарии в начале файла (например, копирайты или заголовки, сгенерированные Xcode). Полезно для очистки кода перед публикацией.
Пример:
swiftformat --stripheaders true example.swift
Исходный код:
//
// ViewController.swift
// MyApp
//
// Created by User on 01.01.2024.
//
import UIKit
После форматирования:
import UIKit
4.5. Правило redundantSelf — удаление избыточного self
Сигнатура: --self [remove|insert|keep]
Что делает: Управляет использованием self в методах. remove удаляет лишние self, insert добавляет их везде, keep оставляет как есть.
Пример:
swiftformat --self remove example.swift
Исходный код:
class MyClass {
var value = 0
func update() {
self.value = 10
}
}
После форматирования:
class MyClass {
var value = 0
func update() {
value = 10
}
}
4.6. Правило linebreaks — стиль переноса строк
Сигнатура: --linebreaks [lf|crlf|cr]
Что делает: Устанавливает тип переноса строк: lf (Unix/macOS), crlf (Windows), cr (старый Mac OS).
Пример:
swiftformat --linebreaks lf example.swift
Все переносы строк будут приведены к формату Unix (LF).
4.7. Правило semicolons — управление точками с запятой
Сигнатура: --semicolons [never|always|inline]
Что делает: never удаляет все точки с запятой, always добавляет их в конец каждой строки, inline позволяет их только при объявлении нескольких операторов в одной строке.
Пример:
swiftformat --semicolons never example.swift
Исходный код:
let a = 1; let b = 2;
После форматирования:
let a = 1
let b = 2
4.8. Правило maxWidth — максимальная длина строки
Сигнатура: --maxwidth [число]
Что делает: Ограничивает длину строки указанным числом символов. Если строка длиннее, она будет перенесена.
Пример:
swiftformat --maxwidth 80 example.swift
Длинные строки будут автоматически разбиты на несколько строк, чтобы не превышать 80 символов.
5. Реальный практический пример (100-200 строк кода)
Представьте, что вы получили от коллеги файл UserManager.swift в ужасном состоянии. Вот его исходный код:
import Foundation
class UserManager{
var users:[String]=[]
func addUser(name:String){
users.append(name)
}
func printUsers(){
for user in users{
print("User: \(user)")
}
}
func findUser(name:String)->String?{
for user in users{
if user==name{
return user
}
}
return nil
}
}
Запустим SwiftFormat с оптимальными настройками для типичного iOS-проекта:
swiftformat UserManager.swift \
--indent spaces 4 \
--allman false \
--trailingcommas true \
--self remove \
--semicolons never \
--maxwidth 100 \
--linebreaks lf
После форматирования получаем:
import Foundation
class UserManager {
var users: [String] = []
func addUser(name: String) {
users.append(name)
}
func printUsers() {
for user in users {
print("User: \(user)")
}
}
func findUser(name: String) -> String? {
for user in users {
if user == name {
return user
}
}
return nil
}
}
Что изменилось:
- Добавлены пробелы после двоеточий в типах (
name: String). - Пробелы вокруг операторов (
==,+=). - Отступы стали единообразными (4 пробела).
- Фигурные скобки открываются на той же строке (стиль K&R).
- Удалён избыточный
self(хотя его и не было). -
Также в библиотеке
Рекомендаций