#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»))