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



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



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
613   2  

2 ответов:

Попробуйте вот что:

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 импортируются как UInts, поэтому они автоматически соединяются с NSNumber при преобразовании в AnyObject, как содержится в NSDictionary.

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

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

На мой взгляд, это должно быть улучшено, и лучше отправить отчет об ошибке в Яблоко или swift.org .

На случай, если кому-то понадобится помощь в Swift 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
    }
}

Comments

    Ничего не найдено.