我发现在pdf中获取内容类型。我在this example上构建了我的代码,我试图从字典中读取内容类型。我发现类型的键是 Type 。但是我得到一个错误:
致命错误:在解包可选值时意外发现nil
这是我的代码:
pdfDoc = CGPDFDocumentCreateWithURL(url)
if (pdfDoc != nil) {
let pdfCatalog=CGPDFDocumentGetCatalog(pdfDoc)
var uriStringRef: UnsafeMutablePointer< CGPDFStringRef>!
if (CGPDFDictionaryGetString(pdfCatalog, "Type", uriStringRef)) { //error
print(uriStringRef)
}
}
唯一的参数是uriStringRef
。但是from the example,我不应该在传递给CGPDFDictionaryGetString
之前设置为任何值,并且根据Apple's documentation,这应该根据键"Type"
得到字符串返回值。我是对的吗?
我该如何解决这个问题?
答案 0 :(得分:0)
您正在将一个未初始化的指针传递给CGPDFDictionaryGetString
方法,这是不安全的,因为您无法知道被调用的方法是否在写入之前尝试从指针读取。
来自Swift博客文章Interacting with C Pointers:
作为输入/输出参数的指针
C和Objective-C不支持多个返回值,因此Cocoa API经常使用指针作为将额外数据传入和传出函数的方法。 Swift允许将指针参数视为inout参数,因此您可以使用相同的
var
语法将对&
的引用作为指针参数传递。为了安全起见,Swift要求在使用
&
传递变量之前对变量进行初始化。这是因为它无法知道被调用的方法是否在写入之前尝试从指针读取。
初始化CGPDFStringRef
&#39;指针&#39;像这样:
var uriStringRef = CGPDFStringRef.init()
使用inout语法将其传递给方法:
CGPDFDictionaryGetString(pdfCatalog, "Type", &uriStringRef)