Создайте приложение на основе документа 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
:
С этим последним изменением мы закончили! Создайте и запустите проект и опробуйте свое новое блестящее приложение на основе документов, используя ссылочные типы!
Удачного кодирования!
Ресурсы
- Загрузите полный исходный код этого руководства здесь.