在Swift中将rawValue转换为字符串

时间:2017-10-02 18:59:53

标签: swift

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的东西?

2 个答案:

答案 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)")
}

这将打印出文档中存在的属性。