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

07 апреля 2023

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

Оригинал статьи

Содержание