Добавить объявление

Transferable в iOS: как научить ваши данные drag&drop и шерингу

Задумывались ли вы, как разные приложения на вашем iPhone так легко обмениваются данными? Вы копируете текст из Safari и вставляете его в Notes, перетаскиваете файл из Finder в Telegram или скидываете фото через AirDrop. Эта магия кажется пользователю простой, но для разработчика за ней стоит сложная задача: как объяснить системе, что ваши кастомные данные тоже умеют «путешествовать»? В iOS 16 компания Apple представила ответ - протокол Transferable, ставший основой фреймворка Core Transferable. Это не просто еще один API, а декларативный мост, который навсегда меняет подход к реализации drag&drop, шеринга и других операций передачи данных.

Эволюция обмена данными:


До появления Transferable реализация перетаскивания или копирования кастомных объектов была квестом. Разработчику приходилось вручную работать с низкоуровневыми API вроде NSItemProvider, конвертировать свои модели в примитивные типы (String, Data, URL), писать кучу императивного кода для экспорта и импорта, а также обрабатывать множество состояний и ошибок.

Transferable переворачивает эту парадигму. Теперь вы декларируете возможности вашего типа прямо в его расширении, отвечая на вопрос системы: «Как я могу представить себя для передачи?». Система сама берет на себя всю тяжелую работу по управлению жизненным циклом передачи, взаимодействию с системными контроллерами и обработке ошибок.

TransferRepresentation: язык, на котором ваши данные говорят с системой:


Сердце протокола - свойство transferRepresentation. Это перечисление доступных представлений вашего типа для разных сценариев. Ключевая мощь в том, что вы можете предложить системе несколько вариантов одновременно, и она выберет оптимальный.

  • CodableRepresentation: идеально для передачи структурированных данных между приложениями. Если ваш тип соответствует Codable, вы легко получаете сериализацию/десериализацию в JSON или Property List. Вы определяете кастомный UTType (как UTType.note), и система понимает, как с этим работать.

  • FileRepresentation: для всего, что является или может быть представлено как файл. Вы указываете content type (например, .image, .pdf) и замыкания для экспорта (например, сохранение временного файла) и импорта (загрузка полученного файла). Система автоматически управляет файлами во временной директории.

  • ProxyRepresentation: мост к уже существующим, системным типам. Если ваша модель содержит текст, ссылку или изображение, вы можете экспортировать это свойство. Это позволяет, например, перетащить объект Note в TextField, и вставится только его текстовое содержимое.

Один раз объявил - получил все:


После того как вы реализовали Transferable, ваша модель автоматически получает суперспособности во всех контекстах, где SwiftUI или система используют этот протокол:

  • Drag & Drop в SwiftUI: модификатор .draggable(YourModel()) для перетаскивания и .dropDestination(for: YourModel.self) для приема работают из коробки.

  • Кнопка «Поделиться» (ShareLink): в SwiftUI вы можете создать ShareLink("Поделиться", item: yourModelInstance). Система сама построит интерфейс шеринга со всеми доступными опциями (Messages, Mail, AirDrop и т.д.).

  • Интеграция с системой: ваши данные автоматически начинают работать с NSItemProvider под капотом, что открывает совместимость с UIKit и даже другими платформами.

Вывод:


Core Transferable и протокол Transferable - это не просто техническое обновление, а смена парадигмы в разработке под экосистему Apple. Они переводят сложную, императивную и подверженную ошибкам логику передачи данных на уровень декларативных моделей.

Главная особенность в согласованности и надежности. Вы один раз описываете, как ваш тип данных может представлять себя миру и эта декларация начинает работать универсально: в вашем собственном UI, в системных диалогах шеринга, при перетаскивании между приложениями и даже между устройствами через Continuity.
09.04.2026 54 566