как заставить массив включать документ PDF

#ios #arrays #swift #if-statement

#iOS #массивы #swift #if-оператор

Вопрос:

Я новичок в swift и пытаюсь выяснить, как закодировать мой массив для включения документа PDF. Я настроил TableView так, чтобы при нажатии на ячейку переходил к новому контроллеру подробного просмотра. Я хочу, чтобы новый контроллер сведений отображал PDF, связанный с выбранной ячейкой. Есть ли разумный способ закодировать это?

Я боролся с тем, как закодировать эту часть.

 import Foundation
import UIKit
import PDFKit

class State
{
    var title: String
    var detailText: String
    var description: String
    var image: UIImage

    var document: PDFDocument

    init(titled: String, detailText: String, imageName: String, description: String, document: String)
    {
        self.title = titled
        self.detailText = detailText
        self.description = description

        self.document = PDFDocument

        if let img = UIImage(named: imageName){
            image = img
        } else {
            image = UIImage(named: "default")!
        }
    }
}
  

Я пытаюсь заставить код распознавать «document» как PdfDocument, но я получаю сообщение об ошибке: не удается присвоить значение типа ‘PdfDocument.Введите ‘, чтобы ввести ‘PdfDocument’, где я ошибаюсь?

Ответ №1:

Причина ошибки в том, что вы пытаетесь присвоить Тип ( PDFDocument ) self.document вместо параметра, который был передан в init document . Также тип параметра должен быть a PDFDocument , а не String .

 import Foundation
import UIKit
import PDFKit

class State
{
    var title: String
    var detailText: String
    var description: String
    var image: UIImage

    var document: PDFDocument

    init(titled: String, detailText: String, imageName: String, description: String, document: PDFDocument)
    {
        self.title = titled
        self.detailText = detailText
        self.description = description

        self.document = document

        if let img = UIImage(named: imageName){
            image = img
        } else {
            image = UIImage(named: "default")!
        }
    }
}
  

Если вам не нужно State быть классом по какой-либо другой причине, я бы предложил сделать это структурой — это дает неявную неизменяемость. Вы также можете упростить это if утверждение, используя оператор объединения nil

 import Foundation
import UIKit
import PDFKit

struct State
{
    var title: String
    var detailText: String
    var description: String
    var image: UIImage
    var document: PDFDocument

    init(titled: String, detailText: String, imageName: String, description: String, document: PDFDocument)
    {
        self.title = titled
        self.detailText = detailText
        self.description = description

        self.document = document
        self.image = UIImage(named: imageName) ?? UIImage(named: "default")!
    }
}
  

ОК,

Похоже, что ваш актуальный вопрос заключается в том, «Как мне получить PDFDocument из моего пакета приложений?».

Вы можете использовать что-то вроде этого:

 if let path = Bundle.main.path(forResource: "SomePdfFile", ofType: "pdf") {
      do {
          let fileUrl = URL(fileURLWithPath: path)
          if let pdfDocument = PDFDocument(url:fileURL) {
              // Do something with PDFDocument
          }
      } catch {
          print("There was an error - (error)")
      }
}
  

Вы могли бы превратить это в функцию:

 func loadPDF(named: String) throws -> PDFDocument? {
    guard let path = Bundle.main.path(forResource: "SomePdfFile", ofType: "pdf") else {
        return nil
   }

   let fileUrl = URL(fileURLWithPath: path)
   return PDFDocument(url:fileURL)
}
  

Комментарии:

1. Я реализовал ваш код выше, но получаю ошибку в строке self.document = PdfDocument ошибка: не удается присвоить значение типа ‘PdfDocument. Введите ‘ для ввода ‘PdfDocument’ Я что-то упускаю?

2. Извините, это была ошибка вырезания и вставки. Я обновил его

3. Я изменил на document, как вы объяснили, но получаю новую ошибку: не удается присвоить значение типа ‘String’ типу ‘PdfDocument’. Я боролся с этим в течение нескольких дней.

4. Вам нужно передать a, PDFDocument который вы создали из URL , а не String .

5. Я думаю, мой последний вопрос таков: должен ли я делать это в этой структуре? Вот как выглядит мой массив:var states = [State]() states.append(Состояние (с названием: «Алабама», подробный текст: «Взаимное состояние», имя изображения: «usaFlag», описание: «Соглашение существует», документ: «Алабама.pdf»))