Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift:PDF文档写入_Swift_Quartz Graphics - Fatal编程技术网

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。我还没有测试其他选项是否有效,但它们应该有效,并且所有有效选项都应该定义为常量。最好给苹果发封邮件。