Apple已从Swift 3更改为4.当我运行以下代码时:
let metadata = [ PDFDocumentAttribute.titleAttribute,
PDFDocumentAttribute.authorAttribute,
PDFDocumentAttribute.subjectAttribute,
PDFDocumentAttribute.creatorAttribute,
PDFDocumentAttribute.producerAttribute,
PDFDocumentAttribute.creationDateAttribute,
PDFDocumentAttribute.modificationDateAttribute,
PDFDocumentAttribute.keywordsAttribute ]
if var attributes = pdfDoc.documentAttributes {
for (index, value) in metadata.enumerated() {
if attributes[value] != nil {
print("\(metadata[index])): \(String(describing: attributes[value]!))")
} else {
print("\(metadata[index]): nil")
}
}
我现在得到: PDFDocumentAttribute(_rawValue:Title)而不是" Title",我之前得到的是metadata[index]
的值。
如何摆脱rawValue的东西?
答案 0 :(得分:3)
PDFDocumentAttribute
类型有一个名为rawValue
的属性,其中包含旧的字符串值。所以你可以说
print("\(metadata[index].rawValue): \(String(describing: attributes[value]!))")
除此之外,您可以使用if let
而不是强行展开属性,而不是
if let attr = attributes[value] {
print("\(metadata[index].rawValue): \(attr)")
} else {
print("\(metadata[index].rawValue): nil")
}
答案 1 :(得分:1)
如果您添加此扩展程序:
extension PDFDocumentAttribute: CustomStringConvertible {
public var description: String {
return self.rawValue
}
}
现在你可以这样做:
// Forcing the downcast has little risk here
// but you may want to use `as?` and test for the optional instead
let attributes = pdfDoc.documentAttributes as! [PDFDocumentAttribute:Any]
for meta in metadata {
print("\(meta): \(attributes[meta] ?? "nil")")
}
请注意,您也可以这样做:
for attribute in attributes {
print("\(attribute.key): \(attribute.value)")
}
这将打印出文档中存在的属性。