web-dev-qa-db-ja.com

NSAttributedString.DocumentAttributeKey型の値を.DocumentReadingOptionKeyに変換できません

この文字列拡張は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」に変換できません

どうすれば修正できますか?

35
LinusGeffarth

利用可能なNSAttributedString DocumentType オプションのいずれかを渡す必要があります。


ハイパーテキストマークアップ言語(HTML)ドキュメント。

static let html: NSAttributedString.DocumentType

プレーンテキストドキュメント。

static let plain: NSAttributedString.DocumentType

リッチテキスト形式のドキュメント。

static let rtf: NSAttributedString.DocumentType

添付文書付きのリッチテキスト形式。

static let rtfd: NSAttributedString.DocumentType

この場合、最初の(html)NSAttributedString.DocumentType.htmlを渡す必要があります

したがって、拡張子 pdated to 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インポートメカニズムは、一般的なHTMLインポートではなく、マークダウン(テキストスタイル、色など)のようなものを実装するためのものです。

88
Leo Dabus

Swift 4への自動変換後にこれがありました。4から変更することで修正されました。

NSMutableAttributedString(data: data, 
   options: [NSAttributedString.DocumentAttributeKey.documentType : NSAttributedString.DocumentType.html], 
   documentAttributes: nil)

に:

NSMutableAttributedString(data: data,
   options: [.documentType : NSAttributedString.DocumentType.html],
   documentAttributes: nil) {
19
Vitalii

これは私のために働く:

let attrStr = try! NSAttributedString(
    data: modifiedFont.data(using: .unicode, allowLossyConversion: true)!,
    options:[.documentType: NSAttributedString.DocumentType.html,
    .characterEncoding: String.Encoding.utf8.rawValue],
    documentAttributes: nil)

追加しない場合

.characterEncoding:String.Encoding.utf8 .rawValue

アプリがクラッシュします。

12
hall.keskin

Swift 4:理由はわかりませんが、すべての回答にはコンパイラエラーがあります。だから私はこの拡張を使用します:

extension String {
    var html2AttributedString: NSAttributedString? {
        do {
            return try NSAttributedString(data: data(using: String.Encoding(rawValue: String.Encoding.utf8.rawValue))!,
                                          options: [.documentType: NSAttributedString.DocumentType.html,
                                                    .characterEncoding: String.Encoding.utf8.rawValue],
                                          documentAttributes: nil)
        } catch {
            print("error: ", error)
            return nil
        }
    }
    var html2String: String {
        return html2AttributedString?.string ?? ""
    }
}

使い方 ?

mylable.text = htmlVariable.html2String

4
iman kazemayni

HTML文字列の場合、NSAttributedString.DocumentType.htmlが正しいオプションです。

スイフト4

extension String {

    var utfData: Data? {
        return self.data(using: .utf8)
    }

    var htmlAttributedString: NSAttributedString? {
        guard let data = self.utfData else {
            return nil
        }
        do {
            return try NSAttributedString(data: data,
           options: [
                     NSAttributedString.documentType: NSAttributedString.DocumentType.html,
                     NSAttributedString.characterEncoding: String.Encoding.utf8.rawValue
                    ], documentAttributes: nil)
        } catch {
            print(error.localizedDescription)
            return nil
        }
    }
}
4
Suhit Patil

NSAttributedString.DocumentType.htmlを使用

NSMutableAttributedString(data: data, options: [.documentType: NSAttributedString.DocumentType.html] , documentAttributes: nil)
1
Bhanu

NSAttributedStringKeyを使用していますが、Swift 4で同様のエラー「型の値を変換できません」がありました。

let TextStroke: [NSAttributedStringKey : Any] = [
    NSAttributedStringKey(rawValue: NSAttributedStringKey.strokeColor.rawValue) : UIColor.black,
    NSAttributedStringKey(rawValue: NSAttributedStringKey.foregroundColor.rawValue) : UIColor.white,
    NSAttributedStringKey(rawValue: NSAttributedStringKey.strokeWidth.rawValue) : -6.0,]

そして、これはテキストに属性を追加する方法です:

myLabel.attributedText = NSAttributedString(string: myString, attributes: TextStroke)
0
tomDev