SwiftUIでmacOSのパッケージ形式ドキュメントを作成したい

実現したいこと

SwiftUIのテンプレートDocument-baseを使って、
macOSのパッケージ形式ドキュメントを作成し、読み書きしたい.

具体的には、setting.jsonとsrc.jsonをひとまとめにファイルとして扱い、読み書きしたい。

前提

以下のページを参考にパッケージ形式のドキュメントを作成したいと考えています。
macOSのパッケージ形式ドキュメント

現在、作成中のプロジェクトは、SwiftUIのテンプレートDocument-baseを使っており、うまく融合できません。

ソースコード抜粋

  • テンプレートを改造した読み込み処理

swift

1num DocContent:String {2 case setting = "setting.json"3 case src = "src.json"4 5}6 7/// Make the temporary unique URL8private func makeUniqueTempURL() -> URL {9 // More uniqueness10 URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent(UUID().uuidString)11}12 13class ADocument: FileDocument {14 15 // 略16 17 required init(configuration: ReadConfiguration) throws {18 19 20 // Make new temporary directory21 let tempDirURL = makeUniqueTempURL()22 // Post process23 defer {24 try? FileManager.default.removeItem(at: tempDirURL)25 }26 27 28 29 30 do {31 // Unzip the document file, and read the content as a FileWrapper32 try FileManager.default.unzipItem(at: url, to: tempDirURL)       <−− urlがわからない? 33 34 } catch {35 throw error 36 }37 38 39 guard configuration.file.isDirectory else { fatalError("invalid filewrapper") }40 guard let fileWrappers = configuration.file.fileWrappers else { fatalError("invalid filewrapper") }41 42 // setting json 43 //44 if let settingFileWrapper = fileWrappers[DocContent.setting.rawValue] { <ーー解凍処理したファイルは、ここにはない? 45 if let data = settingFileWrapper.regularFileContents,46 let string = String(data: data, encoding: .utf8) {47 text = string 48 self.setting = try JSONDecoder().decode(Row.self, from: data)49 50 }51 52 }53 54 // src json55 56 if let srcFileWrapper = fileWrappers[DocContent.src.rawValue] {   <ーー解凍処理したファイルは、ここにはない? 57 if let data = srcFileWrapper.regularFileContents,58 let string = String(data: data, encoding: .utf8) {59 text = string 60 self.rowData = try JSONDecoder().decode(Row.self, from: data)61 62 }63 64 }65 66 67

  • テンプレートを改造した読み込み処理

以下のコードでsaveすると、フォルダ(setting.json,scr.json)が作成されてしまう。

swift

1func fileWrapper(configuration: WriteConfiguration) throws -> FileWrapper {2 3 4 // save src5 let src = try JSONEncoder().encode(rowData)6 let srcFileWrapper = FileWrapper.init(regularFileWithContents: src)7 8 //save setting9 let setting = try JSONEncoder().encode(setting)10 let settingFileWrapper = FileWrapper.init(regularFileWithContents: setting)11 12 13 14 let rootFileWrapper = FileWrapper.init(directoryWithFileWrappers: [DocContent.src.rawValue: srcFileWrapper,15 DocContent.setting.rawValue: settingFileWrapper,16 ])17 return rootFileWrapper 18 19 }20}

補足情報(FW/ツールのバージョンなど)

xcode -v 14.2
swift -v 5.7.2

コメントを投稿

0 コメント