Swift:PDF文档写入
斯威夫特似乎又变了,我很难让这段代码正常工作:Swift:PDF文档写入,swift,quartz-graphics,Swift,Quartz Graphics,斯威夫特似乎又变了,我很难让这段代码正常工作: let pdf_url = URL(fileURLWithPath: filename) let pdf_doc = PDFDocument.init(url: pdf_url) let value = "Bibbly" let diction = [kCGPDFContextCreator : value ] as Any pdf_doc!.write(toFile: filename, withOptions:
let pdf_url = URL(fileURLWithPath: filename)
let pdf_doc = PDFDocument.init(url: pdf_url)
let value = "Bibbly"
let diction = [kCGPDFContextCreator : value ] as Any
pdf_doc!.write(toFile: filename, withOptions: (diction as [PDFDocumentWriteOption : Any]))
我得到以下错误:“CFString”不能转换为“Any”
有人知道问题出在哪里吗?API参考资料如下:
与API参考中一样,withOptions参数的类型是[PDFDocumentWriteOptions:Any],因此将您的措辞声明为Any不是一个好主意
let diction: [PDFDocumentWriteOption : Any] = [kCGPDFContextCreator : value]
有了这行代码,Xcode给了我一个建议:
let pdf_url = URL(fileURLWithPath: filename)
if let pdf_doc = PDFDocument(url: pdf_url) {
let value = "Bibbly"
let diction: [PDFDocumentWriteOption : Any] = [kCGPDFContextCreator as PDFDocumentWriteOption : value]
pdf_doc.write(toFile: filename, withOptions: diction)
} else {
print("PDF document at: \(filename) cannot be opened!")
//...
}
“CFString”不能隐式转换为“PDFDocumentWriteOption”;
您的意思是使用“as”来显式转换吗
因此,我接受了这个建议:
let pdf_url = URL(fileURLWithPath: filename)
if let pdf_doc = PDFDocument(url: pdf_url) {
let value = "Bibbly"
let diction: [PDFDocumentWriteOption : Any] = [kCGPDFContextCreator as PDFDocumentWriteOption : value]
pdf_doc.write(toFile: filename, withOptions: diction)
} else {
print("PDF document at: \(filename) cannot be opened!")
//...
}
这段代码编译没有问题。谢谢。您能解释一下在同一定义中必须显式设置两次类型的必要性吗?还是仅仅因为Xcode这么说?@benwiggy,如果你是说查找PDFDocumentWriteOption两次,因为kCGPDFContextCreator的类型是CFString,而不是PDFDocumentWriteOption。因此,您需要显式地将CFString转换为PDFDocumentWriteOption。建议使用diction的显式类型注释[PDFDocumentWriteOption:Any],以澄清它是为Swift编译器的withOptions提供的。考虑到kCGPDFContextCreator是苹果提供的常量,设计用于此目的,这似乎有点疯狂。事实上,在High Sierra上,脚本不会改变创建者元数据字段;但在塞拉利昂确实如此。但我离题了。谢谢。@benwiggy,你对这种情况的感觉很合理。当Apple创建此包装类型PDFDocumentWriteOption时,仅为该类型定义了两个常量成员:ownerPasswordOption和userPasswordOption。我还没有测试其他选项是否有效,但它们应该有效,并且所有有效选项都应该定义为常量。最好给苹果发封邮件。