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 и задавать вопросы по этой статье. Спасибо за чтение, и до следующей недели!
