当前位置: 首页 > 面试题库 >

无法将NSAttributedString.DocumentAttributeKey类型的值转换为.DocumentReadingOptionKey

伯彦君
2023-03-14
问题内容

我在SO的某处找到了此字符串扩展名,它使我可以将html代码转换为属性字符串:

func html2AttributedString() -> NSAttributedString {
    return try! NSAttributedString(data: self.data(using: String.Encoding.unicode, allowLossyConversion: true)!, options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType], documentAttributes: nil)
}

在Swift 3中工作正常,但在Swift 4中,Xcode抱怨:

无法将类型“ NSAttributedString.DocumentAttributeKey”的值转换为预期的字典密钥类型“
NSAttributedString.DocumentReadingOptionKey”

我该如何解决?


问题答案:

您需要传递可用的NSAttributedString
DocumentType选项之一:

超文本标记语言(HTML)文档。

static let html: NSAttributedString.DocumentType

纯文本文档。

static let plain: NSAttributedString.DocumentType

富文本格式的文档。

static let rtf: NSAttributedString.DocumentType

带附件文档的RTF格式。

static let rtfd: NSAttributedString.DocumentType

在这种情况下,您将需要通过第一个(html) NSAttributedString.DocumentType.html

因此,为Swift 4 的扩展应如下所示:

extension NSAttributedString {
    convenience init(data: Data, documentType: DocumentType, encoding: String.Encoding = .utf8) throws {
        try self.init(data: data,
                      options: [.documentType: documentType,
                                .characterEncoding: encoding.rawValue],
                      documentAttributes: nil)
    }
    convenience init(html data: Data) throws {
        try self.init(data: data, documentType: .html)
    }
    convenience init(txt data: Data) throws {
        try self.init(data: data, documentType: .plain)
    }
    convenience init(rtf data: Data) throws {
        try self.init(data: data, documentType: .rtf)
    }
    convenience init(rtfd data: Data) throws {
        try self.init(data: data, documentType: .rtfd)
    }
}
extension StringProtocol {
    var data: Data { return Data(utf8) }
    var htmlToAttributedString: NSAttributedString? {
        do {
            return try .init(html: data)
        } catch {
            print("html error:", error)
            return nil
        }
    }
    var htmlDataToString: String? {
        return htmlToAttributedString?.string
    }
}
extension Data {
    var htmlToAttributedString: NSAttributedString? {
        do {
            return try .init(html: self)
        } catch {
            print("html error:", error)
            return nil
        }

    }
}

游乐场测试

let htmlString = "<style type=\"text/css\">#red{color:#F00}#green{color:#0F0}#blue{color: #00F; font-weight: Bold; font-size: 32}</style><span id=\"red\" >Red</span><span id=\"green\" > Green </span><span id=\"blue\">Blue</span>"

let htmlData = Data(htmlString.utf8)

htmlString.htmlToAttributedString
htmlData.htmlToAttributedString

讨论不应从后台线程调用HTML导入器(即,选项字典包含值为html的documentType)。它将尝试与主线程同步,失败并超时。从主线程调用它是可行的(但如果HTML包含对外部资源的引用,仍可能会超时,应该不惜一切代价避免这样做)。HTML导入机制用于实现诸如markdown之类的东西(即,文本样式,颜色等),而不是用于常规HTML导入。



 类似资料:
  • 问题内容: 我试图将视图控制器转换为详细视图控制器,但不能。我正在使用Core Data(第一次)。错误发生在prepareForSegue方法中,显示为:“无法将类型’UIViewController’(0x1b81cdc)的值强制转换为’Patternz.PatternDetailViewController’(0x32488)。(lldb)” 希望能解释为什么它不起作用。这是文件。 View

  • 问题内容: 我有一个JSON文件,其中包含2个JSON数组:一个用于路线的数组,一个用于景点的数组。 一条路线应由用户导航到的多个景点组成。不幸的是我遇到了错误: JSONException:无法将类型为java.lang.String的值转换为JSONObject 这是我的变量和解析JSON文件的代码: Log.i(“ JSON Parser”,json); 告诉我在生成的字符串的开头有一个奇怪

  • 这是控制器代码部分: 我收到这条消息: 出现错误(类型=错误请求,状态=400)。无法将类型[java.lang.String]的值转换为所需类型[java.util.Date];嵌套异常为org.springframework.core.convert.conversionfailedexception:无法将值“Wed Jun 08 00:00:00 WET 2016”从类型[java.lan

  • 我有两个实体,它们使用一个主键互相引用,主键是一个实体的整数。我不确定我做这件事的方式是否正确。 下面是引用主键id为int的实体 下面是我们从上面的实体中将外键设置为Kmichango kandaMchango的实体。 这里是表单的一部分,我在这里提交了用户在jumuiya_michango_form.html中提供的数据 下面是我的控制器中用于链接到表单和发布数据的两个方法 在我提交表单后,我

  • 问题内容: 这是我的代码的一部分: 这是Tumblr API的JSON的一部分: 等等。 这是我的错误: 在这行上: 我不明白为什么。我对JSON和iOS还是很陌生,但是“响应”对我来说就像字典,我不知道为什么它是NSArray,我也不知道如何解决这个问题。任何帮助将不胜感激。 这不是重复的,因为其他帖子没有帮助我解决此问题。 问题答案: 错误消息说 无法将 实际 类型NSDictionary强制