Расширение NSAttributedString в swift 3

Я переношу свой код в swift 3, и мне сложно с этим расширением, которое работало над предыдущей быстрой версией.

extension Data {
    var attributedString: NSAttributedString? {
        do {
            return try NSAttributedString(data: self, options:[NSDocumentTypeDocumentAttribute:NSHTMLTextDocumentType, NSCharacterEncodingDocumentAttribute: String.Encoding.utf8], documentAttributes: nil)
        } catch let error as NSError {
            print(error.localizedDescription)
        }
        return nil
    }
}

Теперь, когда я пытаюсь вызвать этот фрагмент кода, я получаю ошибку с ошибкой, подобную этой

error: warning: couldn't get required object pointer (substituting NULL): Couldn't load 'self' because its value couldn't be evaluated

То, как я вызываю метод из моего контроллера представления

let htmlCode = "<html><head><style type=\"text/css\">@font-face {font-family: Avenir-Roman}body {font-family: Avenir-Roman;font-size:15;margin: 0;padding: 0}</style></head><body bgcolor=\"#FBFBFB\">" + htmlBodyCode + "</body>"
newsDescription.attributedText = htmlCode.utf8Data?.attributedString

Ответ 1

Попробуйте следующее:

extension Data {
    var attributedString: NSAttributedString? {
        do {
            return try NSAttributedString(data: self, options:[NSDocumentTypeDocumentAttribute:NSHTMLTextDocumentType, NSCharacterEncodingDocumentAttribute: String.Encoding.utf8.rawValue], documentAttributes: nil)
        } catch let error as NSError {
            print(error.localizedDescription)
        }
        return nil
    }
}

Как описано в официальной ссылке, значение для ключа NSCharacterEncodingDocumentAttribute должно быть NSNumber.

NSCharacterEncodingDocumentAttribute

Значение этого атрибута - это объект NSNumber, содержащий целое число, определяющее NSStringEncodingдля файла;

В старых Swifts константы NSStringEncoding импортируются как UInt s, поэтому они автоматически соединяются с NSNumber при преобразовании в AnyObject, как указано в NSDictionary.

Но теперь Swift ввел новый тип перечисления String.Encoding, который не был создан как перечисление Objective-C. И, к сожалению, теперь любые типы Swift могут содержаться в NSDictionary с промежуточным скрытым ссылочным типом _SwiftValue, который определенно НЕ является NSNumber.

Итак, вам нужно передать что-то, что можно привязать к NSNumber как значение для клавиши NSCharacterEncodingDocumentAttribute. В вашем случае rawValue будет работать.

По-моему, это должно быть улучшено и лучше отправить отчет об ошибке в Apple или swift.org.

Ответ 2

Если кому-то нужна помощь в Свифте 4+:

extension Data {
    var attributedString: NSAttributedString? {
        do {
            return try NSAttributedString(data: self, options:[NSAttributedString.DocumentReadingOptionKey.documentType:NSAttributedString.DocumentType.html, NSAttributedString.DocumentReadingOptionKey.characterEncoding: String.Encoding.utf8.rawValue], documentAttributes: nil)
        } catch let error as NSError {
            print(error.localizedDescription)
        }
        return nil
    }
}