API
Суть
API (Application Programming Interface) — контракт между двумя частями кода: набор типов, функций и правил, которые одна сторона публикует, а другая использует, не зная внутренней реализации. Реализацию можно менять, пока контракт сохраняется.
Какие API встречает iOS-разработчик
- Системные фреймворки: Foundation, UIKit, SwiftUI, Swift Concurrency — Apple публикует интерфейс, реализация закрыта.
- Сторонние библиотеки (через Swift Package Manager): публичный интерфейс пакета — это всё, что помечено
public/open. - Сетевые API (REST, GraphQL, gRPC): контракт — это эндпоинты, формат JSON, коды ошибок. На клиенте его отражают
Codable-модели. - Ваш собственный код: модуль, протокол, класс — всё, что используют другие части приложения.
Как выглядит хороший API в Swift
import Foundation
// Контракт: что умеет сервис. Как именно — скрыто.
public protocol ImageLoading: Sendable {
func data(for url: URL) async throws -> Data
}
public struct ImageLoader: ImageLoading {
public init() {}
public func data(for url: URL) async throws -> Data {
let (data, _) = try await URLSession.shared.data(from: url)
return data
}
private func cacheKey(for url: URL) -> String { // не часть API
url.absoluteString
}
}
@available(iOS 26, *)
public func liquidGlassEffect() {} // доступность — тоже часть контракта
- Уровни доступа (
public,internal,private) задают границу API: минимально необходимая поверхность проще поддерживать. - Протокол вместо конкретного типа позволяет подменять реализацию (мок в тестах, кэш в проде).
@available,throws,async,Sendable— часть контракта: они говорят пользователю, когда и как можно вызывать.- Apple API Design Guidelines: читаемость в месте вызова, имена-глаголы для мутирующих методов (
sort()/sorted()).
Чем API отличается от фреймворка и SDK
- API — интерфейс.
- Библиотека/фреймворк — готовый код за этим интерфейсом (UIKit — фреймворк со своим API).
- SDK — набор фреймворков, инструментов и документации (iOS SDK в составе Xcode).
На что смотрит интервьюер
Понимаете ли вы, что изменение публичного API — это breaking change для всех потребителей, и что внутри приложения тоже стоит проектировать границы модулей как API: через протоколы и минимальную видимость.