Расширение 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
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