Создайте приложение на основе документа SwiftUI, используя ссылочные типы вместо типов значений для вашего документа.

На WWDC 2020 Apple представила создание приложений на основе документов, полностью созданных в SwiftUI с использованием нового элемента DocumentGroup. Наряду с этим новым дополнением Xcode 12 также предоставляет встроенный шаблон для создания приложения на основе документа с использованием SwiftUI с использованием FileDocument. Новый шаблон отлично работает, если вы используете типы значений для своего документа, но как насчет использования ссылочных типов?

К счастью, Apple подумала об этом и также предоставила нам протокол для справочно-типизированных документов под названием ReferenceFileDocument, но (на момент написания этой статьи) еще не объяснила его использование. В этой статье я продемонстрирую, как использовать ReferenceFileDocument путем преобразования предоставленного Apple шаблона Xcode для использования ссылочных типов.

Для начала создайте новый проект Xcode, используя тип шаблона Multiplatform -> Document App. Откройте сгенерированный <YourProjectName>Document.swift file и осмотритесь. Как видите, Xcode сгенерировал структуру для нашего документа, которая принимает протокол FileDocument. Первое, что нам нужно сделать, это изменить эту структуру на класс и изменить протокол на useReferenceFileDocument:

Если вы выполните сборку и запустите сейчас, вы получите сообщение об ошибке, но мы скоро исправим эту проблему. Чтобы решить проблемы с компилятором, нам нужно правильно соответствовать протоколу ReferenceFileDocument.

Затем замените существующую функцию write() следующей:

Как видите, протокол ReferenceFileDocument заменяет функцию write() новой версией, которая передает Snapshot функции, которая предоставляется нашей реализацией метода snapshot(). Документация Apple описывает Snapshot как:

Тип моментального снимка документа, который можно использовать для сериализации параллельно с основным редактируемым документом.

Проще говоря, это просто «копия» текущего состояния документа, которая будет записана в файл при сохранении. В этом примере мы просто возвращаем текущее значение self.text.

Теперь осталось обновить еще один элемент служебной информации в нашем файле документа. ReferenceFileDocument соответствует протоколу ObservableObject, поэтому для того, чтобы изменения нашего документа были заметны для SwiftUI, нам нужно добавить @Published оболочку свойств к нашей text переменной:

Осталось всего несколько шагов, прежде чем мы сможем построить и запустить наш проект. Перейдите к <YourProjectName>App.swift и замените свойство body следующим:

Наконец, нам нужно изменить переменную document в ContentView.swift, чтобы использовать @ObservedObject вместо @Binding:

С этим последним изменением мы закончили! Создайте и запустите проект и опробуйте свое новое блестящее приложение на основе документов, используя ссылочные типы!

Удачного кодирования!

Ресурсы

  • Загрузите полный исходный код этого руководства здесь.