Перейти к основному содержимому

Простые приложения на Swift

Разработчику Архитектору

Простые приложения на Swift

Swift одинаково пригоден для iOS/macOS и для консольных утилит (swift run). Foundation даёт файлы, JSON (Codable), HTTP (URLSession). Примеры ниже — без SwiftUI; UI — в разделе про async и платформенных главах.

После первой программы и типов.

Как запускать примеры из главы

  1. Сохраните код в имя.swift.
  2. Команда: swift имя.swift (или swift run в Swift Package).
  3. Проверка: swift --version (Swift 5.9+).

Генератор паролей

Как запустить

  • Файл: password.swift
  • Команда: swift password.swift
  • Результат: строка пароля в терминале.
import Foundation

func generatePassword(length: Int = 16) -> String {
let chars = Array("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%")
return String((0..<length).map { _ in chars.randomElement()! })
}

print(generatePassword())

Для паролей в продакшене используйте SecRandomCopyBytes из Security framework.


Сортировщик текстового файла

Как запустить

  • Файл: sort.swift
  • Подготовка: input.txt и output.txt (пути в sortLines).
  • Команда: swift sort.swift
  • Результат: отсортированный файл на диске.
import Foundation

func sortLines(input: URL, output: URL) throws {
let text = try String(contentsOf: input, encoding: .utf8)
let lines = text
.split(whereSeparator: \.isNewline)
.map { String($0).trimmingCharacters(in: .whitespaces) }
.filter { !$0.isEmpty }
.sorted { $0.localizedCompare($1) == .orderedAscending }
try lines.joined(separator: "\n").appending("\n")
.write(to: output, atomically: true, encoding: .utf8)
}

Консольный калькулятор

Как запустить

  • Файл: calc.swift — добавьте вызовы print(calculate(...)) внизу.
  • Команда: swift calc.swift
  • Результат: Optional с числом или nil при ошибке.
func calculate(_ a: Double, _ b: Double, _ op: Character) -> Double? {
switch op {
case "+": return a + b
case "-": return a - b
case "*": return a * b
case "/": return b == 0 ? nil : a / b
default: return nil
}
}

Optional вместо исключений для «некорректной» операции — типичный стиль Swift.


Трекер задач (Codable)

Как запустить

  • Файл: tasks.swift — в main вызовите load / save.
  • Команда: swift tasks.swift
  • Результат: файл tasks.json.
import Foundation

struct Task: Codable {
var id: UUID
var title: String
var done: Bool
}

struct TaskStore {
let url: URL
func load() -> [Task] {
guard let data = try? Data(contentsOf: url),
let tasks = try? JSONDecoder().decode([Task].self, from: data) else { return [] }
return tasks
}
func save(_ tasks: [Task]) throws {
let data = try JSONEncoder().encode(tasks)
try data.write(to: url)
}
}

HTTP GET через URLSession

Как запустить

  • Файл: fetch.swift
  • Команда: swift fetch.swift
  • Нужно: сеть; скрипт ждёт ответ ~1 с (RunLoop).
  • Результат: HTTP-код и начало HTML в консоли.
import Foundation

let url = URL(string: "https://example.com")!
let task = URLSession.shared.dataTask(with: url) { data, response, error in
if let error = error { print(error); return }
if let http = response as? HTTPURLResponse {
print("status:", http.statusCode)
}
if let data = data, let body = String(data: data, encoding: .utf8) {
print(body.prefix(200))
}
}
task.resume()
RunLoop.main.run(until: Date(timeIntervalSinceNow: 1))

Сканер каталога

Как запустить

  • Файл: scan.swift
  • Команда: swift scan.swift
  • Результат: число файлов и суммарный размер.
import Foundation

func scan(directory: URL, extension ext: String) -> (count: Int, bytes: Int64) {
let fm = FileManager.default
guard let enumerator = fm.enumerator(at: directory, includingPropertiesForKeys: [.fileSizeKey]) else {
return (0, 0)
}
var count = 0, bytes: Int64 = 0
for case let fileURL as URL in enumerator {
guard fileURL.pathExtension == ext else { continue }
count += 1
if let size = try? fileURL.resourceValues(forKeys: [.fileSizeKey]).fileSize {
bytes += Int64(size)
}
}
return (count, bytes)
}

Характерный пример для Swift — enum и безопасные значения

Как запустить

  • Файл: parse_port.swift
  • Команда: swift parse_port.swift
  • Результат: 443 для валидного порта, ошибка для 0 и x.
enum ParseError: Error { case invalidPort }

func parsePort(_ s: String) throws -> UInt16 {
guard let value = UInt16(s), value > 0 else { throw ParseError.invalidPort }
return value
}

for sample in ["443", "0", "x"] {
do { print(try parsePort(sample)) }
catch { print("\(sample): ошибка") }
}

enum с associated values и throws — основа API Apple и серверного Swift (Vapor).


См. также: Codable и данные · async/await · ООП

См. также

Другие статьи этого же раздела в боковом меню (как на странице «О разделе»).