CLI фреймворк для Swift: создаём консольные утилиты для iOS/macOS

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

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

Начать курс

CLI фреймворк для Swift: создаём мощные консольные утилиты для iOS и macOS

Swift — это не только язык для мобильных приложений. С появлением Swift Package Manager (SPM) и таких фреймворков, как ArgumentParser, разработчики получили возможность создавать полноценные консольные инструменты для macOS и даже для iOS (в рамках серверных или CI/CD процессов). CLI (Command Line Interface) фреймворки для Swift позволяют парсить аргументы командной строки, обрабатывать флаги, опции и подкоманды, а также генерировать автоматическую справку.

В этой статье мы подробно разберём один из самых популярных и официальных CLI фреймворков — Swift ArgumentParser (разработка Apple). Вы узнаете, как установить его через SPM, написать простой консольный инструмент, добавить подкоманды и аргументы, а также увидите примеры кода для реальных задач.

Что такое CLI фреймворк для Swift?

CLI фреймворк — это библиотека, которая берёт на себя рутинную работу по разбору строки командной строки. Вместо того чтобы вручную писать циклы по CommandLine.arguments, вы описываете структуру команды декларативно: какие аргументы обязательны, какие опциональны, какие флаги поддерживаются. Фреймворк сам генерирует справку (--help) и обрабатывает ошибки ввода.

Основные возможности Swift ArgumentParser:

  • Декларативное описание аргументов и опций
  • Автоматическая генерация справки и версии
  • Поддержка подкоманд (как в git commit или swift build)
  • Валидация типов (Int, String, Double и кастомные)
  • Интеграция с SPM и Xcode

Установка через Swift Package Manager

Добавьте зависимость в Package.swift вашего проекта:

// swift-tools-version:5.9
import PackageDescription

let package = Package(
    name: "MyCLITool",
    dependencies: [
        .package(url: "https://github.com/apple/swift-argument-parser.git",
                 from: "1.2.0")
    ],
    targets: [
        .executableTarget(
            name: "MyCLITool",
            dependencies: [
                .product(name: "ArgumentParser",
                         package: "swift-argument-parser")
            ]
        )
    ]
)

Теперь выполните swift build — библиотека будет загружена и скомпилирована.

Пишем первую команду

Создадим простую утилиту, которая приветствует пользователя по имени и возрасту.

import ArgumentParser

struct Greet: ParsableCommand {
    @Argument(help: "Имя пользователя")
    var name: String

    @Option(name: .shortAndLong, help: "Возраст")
    var age: Int?

    mutating func run() throws {
        if let age = age {
            print("Привет, \(name)! Тебе \(age) лет.")
        } else {
            print("Привет, \(name)!")
        }
    }
}

Greet.main()

Запустите скомпилированный бинарник:

./MyCLITool "Анна" --age 25
# Вывод: Привет, Анна! Тебе 25 лет.

./MyCLITool "Максим"
# Вывод: Привет, Максим!

Автоматически сгенерированная справка (--help) покажет все аргументы и опции.

Подкоманды: структура как в реальных утилитах

Часто CLI инструменты имеют несколько подкоманд: create, delete, list. ArgumentParser поддерживает это из коробки.

import ArgumentParser

struct TaskManager: ParsableCommand {
    static var configuration = CommandConfiguration(
        subcommands: [Add.self, List.self, Delete.self]
    )
}

struct Add: ParsableCommand {
    @Argument(help: "Текст задачи")
    var text: String

    func run() {
        print("Задача добавлена: \(text)")
    }
}

struct List: ParsableCommand {
    func run() {
        print("Список задач:")
        print("1. Купить продукты")
        print("2. Написать статью")
    }
}

struct Delete: ParsableCommand {
    @Argument(help: "ID задачи")
    var id: Int

    func run() {
        print("Задача \(id) удалена")
    }
}

TaskManager.main()

Теперь можно запускать:

./TaskManager add "Выучить Swift"
# Вывод: Задача добавлена: Выучить Swift

./TaskManager list
# Вывод: Список задач: 1. Купить продукты 2. Написать статью

Продвинутые возможности: валидация

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