SwiftUI — значение типа протокола ‘Any’ не может соответствовать ‘View’

#swiftui

#swiftui

Вопрос:

Я пытаюсь преобразовать массив представлений SwiftUI в PDF. Я думаю, что у меня это почти есть, за исключением одной небольшой проблемы — типа массива. Я не могу получить представления в массив, который распознает PDFKit. В приведенном ниже коде, если я заменю

 let tempView = UIHostingController(rootView: view)
  

с

 let tempView = UIHostingController(rootView: PageOne())   
  

приведенный ниже код отлично работает. Но когда я пытаюсь поместить PageOne() в массив типа Any , я получаю ошибку, "Value of protocol type 'Any' cannot conform to 'View'; only struct/enum/class types can conform to protocols" которая имеет смысл. Но чего я не понимаю, так это того, как я должен это делать.

 var viewsToConvert = [Any]()
viewsToConvert.append(PageOne())
viewsToConvert.append(PageTwo())

let pdfData = NSMutableData()
let pdfPageFrame = CGRect(x: 0, y: 0, width: width, height: height)
UIGraphicsBeginPDFContextToData(pdfData, pdfPageFrame, nil)
let graphicsContext = UIGraphicsGetCurrentContext()
for view in viewsToConvert {
   let tempView = UIHostingController(rootView: view)
   tempView.view.frame = CGRect(x: 0, y: 0, width: width, height: height)
            
   UIGraphicsBeginPDFPage()
   tempView.view.layer.render(in: graphicsContext!)
            
   tempView.removeFromParent()
   tempView.view.removeFromSuperview()
}
UIGraphicsEndPDFContext()

return saveViewPdf(data: pdfData, fileName: "Quote")
}
  

Ответ №1:

Вам нужно использовать AnyView вместо Any :

 var viewsToConvert = [AnyView]()
viewsToConvert.append(AnyView(PageOne()))
viewsToConvert.append(AnyView(PageTwo()))
  

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

1. Это сработало! Однако мне любопытно — я попытался передать свои представления в AnyView, используя (PageOne() как! AnyView) и сбой приложения. В чем разница?

2. @squarehippo10 Это потому , что AnyView является просто другим View и PageOne не соответствует AnyView (но для просмотра).