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