SwiftFormat для Swift: полное руководство с примерами

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

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

Начать курс
SwiftFormat Swift: методы, примеры, установка | PythonLib

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
    }
}

Что изменилось:

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