Я хочу иметь массив различных страниц (страницы HTML и PDF, возможно, добавлю еще позже).
Я подумал, что это хороший шанс попрактиковаться в программировании с протоколами.
Вот что я придумал:
protocol PageDataProtocol {
var data: String? {get}
}
protocol PageTitleProtocol {
var title: String {get}
var pageType: Page {get}
}
struct PDFData: PageTitleProtocol {
var title: String
var pageType: Page
}
struct HTMLData: PageDataProtocol, PageTitleProtocol {
var title: String
var data: String?
var pageType: Page
}
enum Page {
case html
case pdf
case links
}
var pageArray : [PageTitleProtocol]? = []
let test = PDFData(title: "title1", pageType: .html)
pageArray?.append(test)
let testtwo = HTMLData(title: "title2", data: "hello", pageType: .pdf)
pageArray?.append(testtwo)
for page in pageArray! {
print (page.title)
if let pg = page as? HTMLData {
print (pg.data)
}
if page.pageType == .pdf {
print ( (page as? HTMLData)?.data )
}
}
Все выглядит хорошо, но, как и в моих заявлениях о печати, есть очевидная проблема.
Редактировать: я не утверждаю, что кодидеальный выше.Но в ответе на вопрос ниже pageArray является необязательным, поскольку перед загрузкой из API может не быть страниц, но это отличается от отсутствия страниц, извлеченных из API.
Нет смысла хранить enum, так какВ любом случае я должен привести к правильному типу.
Идея заключается в том, чтобы я мог сохранять страницы в одном массиве, получать их по мере необходимости и затем отображать в моем контроллере представления (отформатированном моиммодель), а не рисование из 2+ массивов с различными типами в них.
Я представлял себе написание красивого оператора case, чтобы иметь возможность правильно отображать информацию (в моих готовых структурах будут другие поля), но этокажется невозможным с моей реализацией.
Как я могу реорганизовать код, чтобы иметь возможность включать типы страниц, как объявлено выше?