Совместное использование контента в SwiftUI

Apple представила совершенно новый фреймворк CoreTransferable и ShareLink вью в SwiftUI, позволив нам совместно использовать контент и экспортировать его из наших приложений весьма декларативно. На этой неделе мы узнаем, как сделать данные передаваемыми (* переносимыми) и как использовать новое вью ShareLink в SwiftUI.

ShareLink

Новый ShareLink выглядит как обычная кнопка, но вызывает меню Поделиться и экспортирует данные в предоставленном формате. Давайте рассмотрим простой пример использования ShareLink вью в SwiftUI:

struct Food: Codable {     var title: String     var ingredients: [String] } struct ContentView: View {     @State private var food = Food(title: "", ingredients: [])          var body: some View {         Form {             Section {                 TextField("title", text: $food.title)             }                          Section {                 ForEach($food.ingredients, id: \.self) { $item in                     TextField("item", text: $item)                 }                                  Button("Add") {                     food.ingredients.append("")                 }                                  ShareLink(                     "Export",                     item: food.ingredients.joined(separator: ","),                     preview: SharePreview("Export \(food.title)")                 )             }         }     } }

Как вы можете видеть в приведенном выше примере, у нас есть структура Food, содержащая заголовок и массив ингредиентов. Есть форма, позволяющая нам заполнить данными экземпляр типа Food. Внизу формы у нас есть экземпляр вью ShareLink, который экспортирует содержимое блюда в обычную строку, объединяя ингредиенты. Код простой, но обрабатывает отображение меню Поделиться и экспорт данных.

Но что насчет других типов данных, таких как изображения, двоичные данные или любой другой пользовательский формат? Здесь вся магия скрыта за параметром item ShareLink. Он работает с любым типом, соответствующим протоколу Transferable. String, Data и многие другие типы соответствуют данному протоколу «из коробки», поэтому вам ничего не нужно делать, чтобы делиться ими.

Transferable

Теперь мы знаем, как работает вью ShareLink в SwiftUI. Оно основано на протоколе Transferable из фреймворка CoreTransferable. Но что, если мы хотим передать наш собственный тип? В этом случае мы должны этот тип “подвести” под протокол Transferable.

import CoreTransferable extension Food: Transferable {     static var transferRepresentation: some TransferRepresentation {         CodableRepresentation(contentType: .text)     } }

Протокол Transferable прост и имеет только одно требование. Мы должны реализовать свойство transferRepresentation и вернуть некоторый экземпляр типа TransferRepresentation. Фреймворк дает нам уже готовые типы представления: CodableRepresentation, DataRepresentation, FileRepresentation и ProxyRepresentation.

В приведенном выше примере мы используем CodableRepresentation, т.к. наш тип Food соответствует протоколу Codable. Это соответствие позволяет автоматически экспортировать любой экземпляр типа Food в виде строки JSON.

Мы также можем использовать DataRepresentation, если вы можете преобразовать ваш тип значения в экземпляр типа Data, или мы можем использовать FileRepresentation, всякий раз, когда значение представляет файл на диске.

import CoreTransferable import UniformTypeIdentifiers extension UTType {     static var food: UTType {         UTType(exportedAs: "myapp.food.type")     } } extension Food: Transferable {     static var transferRepresentation: some TransferRepresentation {         CodableRepresentation(contentType: .food)         CodableRepresentation(contentType: .text)     } }

Свойство transferRepresentation помечено TransferRepresentationBuilder и позволяет нам объединять различные отображения. Например, вы можете определить разные отображения для разных типов контента. Помните, что порядок имеет значение; вы должны держать наиболее важные отображения выше других.

Сегодня мы узнали о новом фреймворке CoreTransferable и о том, как использовать ShareLink вью в SwiftUI. Фреймворк CoreTransferable играет огромную роль в экспорте ваших данных из приложения. Но еще он работает в случае перетаскивания, - я расскажу об этом на следующей неделе.

Надеюсь, вам понравилась статья. Не стесняйтесь заходить в мой Twitter и задавать вопросы по этой статье. Спасибо за чтение, и до следующей недели!

Подписывайся на наши соцсети: Telegram / VKontakte

Вступай в открытый чат для iOS-разработчиков: t.me/swiftbook_chat

11
Начать дискуссию